一个好的算法生成一个订单号算法、订单号

2023-09-11 02:59:33 作者:失望攒够了吗

虽然我喜欢用的GUID在我的系统中的唯一标识符,它是不是很人性化像一个订单号码字段,其中一个客户可能有重复,为客户服务再presentative。

As much as I like using GUIDs as the unique identifiers in my system, it is not very user-friendly for fields like an order number where a customer may have to repeat that to a customer service representative.

什么是好的算法用于生成顺序编号,以便它是:

What's a good algorithm to use to generate order number so that it is:

唯一 在不连续的(纯粹是为了光学) 只有在数字值(所以它可以很容易地阅读到CSR通过电话或键入) < 10位 可以在中间层产生没有做一个往返到数据库中。

更新(12/05/2009) 在仔细审查每一个发布的答案,我们决定将随机在中间层中的9位数字保存在数据库中。在发生碰撞的情况下,我们会重新生成一个新的号码。

UPDATE (12/05/2009) After carefully reviewing each of the answers posted, we decided to randomize a 9-digit number in the middle tier to be saved in the DB. In the case of a collision, we'll regenerate a new number.

推荐答案

如果中间层无法检查什么订单号已经存在于数据库中,最好也能做到将产生一个随机数的等价物。但是,如果您生成多数民众赞成限制为小于1十亿的随机数,你应该开始围绕担心意外碰撞时的sqrt(1十亿),也就是说,经过几数万条目生成这种方式,碰撞的危险材料。如果订单号是连续的,但在一个变相的方式,即一些大素数模在未来多个1十亿 - 将满足您的要求。

If the middle tier cannot check what "order numbers" already exists in the database, the best it can do will be the equivalent of generating a random number. However, if you generate a random number that's constrained to be less than 1 billion, you should start worrying about accidental collisions at around sqrt(1 billion), i.e., after a few tens of thousand entries generated this way, the risk of collisions is material. What if the order number is sequential but in a disguised way, i.e. the next multiple of some large prime number modulo 1 billion -- would that meet your requirements?