5位数的唯一/随机/不可预测的alpanumberic id,用于电子商务,最低10k id,可以吗?


5-digit unique/random/unpredictable alpanumberic id for eCommerce with min.10k id's,is this ok?

谁能指定的可能性 -

  1. 随机性?
  2. 独特?
  3. 使用安全可靠?
  4. 用户不应该识别下一代或上一代?

substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0 , 5);

在 - 生成随机 5 个字符的字符串中找到了这个

这样做的目的是将其显示为电子商务网站中用户的订单ID,我不应该获得重复项,预测下一个或对用户不安全。

假设每天的订单量为 10,000。这意味着我至少需要 10,000 个唯一的订单 ID。这个 5 位数是否足够独特,可以继续?

在最小情况下,我可以使用YYMMDD-XXXXX,但如果可能的话,更喜欢没有日期!!

另一种生成伪随机字节的方法可以在openssl扩展中找到,官方文档在这里

但如前所述,您将始终必须检查生成的随机 ID 是否已被使用。(并重新生成另一个随机字符串,直到您有一个唯一的字符串)

相反,我强烈建议您首先认真思考为什么要使用随机订单 ID。您尝试通过不使用自动增量来解决什么问题?

如果你想要一个伪随机数,它是唯一的且难以猜测的,你应该考虑使用 GUID/UUID。 GUID 生成库可用于大多数语言。

http://en.wikipedia.org/wiki/Globally_unique_identifier

如果您真的希望输出是"不可预测的"和"唯一的",您不仅必须根据以前生成的值检查值,还可以考虑使用 CSPRNG,具体取决于 ID 的重要性。如果它们仅用于命名和排序,则正常的 RNG 应该就足够了。

请注意 PHP 中 rand()mt_rand() 之间的区别,后者使用 Mersenne twister,这是一种 PRNG,可以根据您的需求产生足够的随机性。

无论如何,5

位数字足以满足您的需求,因为只有数字 (0-9),您才能获得 10 ^ 5 ( = 100k ) 可能性。

你可以同时做这两件事。您可以有一个随机字符串作为唯一 ID,将订单、购物车、客户等表数据库关联在一起。并且,您可以将标准递增 ID 用于提供给客户的订单号。考虑这一点的原因 - 随着时间的推移,如果订单号是连续的,这将使管理员更容易完成订单。

最好的情况是,如果在交易清算或订单真正完成之前不生成最终的"订单"记录 ID - 那么您的订单号将是连续的。

如果你正在生成一个随机字符串 - 那么你必须至少检查一次字符串以确保没有重复项。

使用的是随机字符串,但后来我切换到日期时间 + 微秒 + 随机字符串 - 无需担心重复,唯一 id 有一些有用的信息。