我正在尝试在PHP中创建一个唯一的发票ID,目前正在执行以下操作:
md5(time().$userId);
我可能有并发用户,所以我也添加用户ID以确保它是唯一的,但是md5散列是32个字符长,有没有办法限制输出短(例如,8-10个字符,如果可能的话)同时确保独特性?
注意:输出字符必须相同,因此,只是将用户ID与时间相关联实际上并不是我正在寻找的,因为用户ID可以是可变长度,例如:5,20或100.
答案 0 :(得分:0)
有几种方法可以确保uniqunes
time()
可以正常使用,因为您将其与$userId
连接起来。
您可以使用substr
仅获取字符串的一部分。
话虽如此,还有其他方法可以在php中获取唯一的字符串
我发现自己经常使用的是openssl_random_pseudo_bytes()
。请注意pseudo
,它并非完全随机。
您可以像bin2hex(openssl_random_pseudo_bytes(2))
一样使用它,其中2
是 bytes 的长度,因此它将等于4个字符。
如果您通过urandom
访问Linux,也可以使用exec
,或者更好,请使用fread
虽然它比伪方法更好,但仅限于操作系统。
uniqid
也可以。
如果你真的想要一些真正随机的东西,我建议https://www.random.org/。
随机性来自大气噪声
他们有一个可以使用的API。
random_bytes
(正如@deceze所建议的)也可以正常工作,请注意它仅适用于PHP> 7
选择你的毒药。
答案 1 :(得分:-1)
如果我想这样做,请使用$ userId.time() 我认为这是独一无二的,因为用户暂时不能提交多个订单