我做了以下工作:
strtolower(substr(crypt(time()),7));
但是我发现,有一段时间,我最终得到一个重复的键(很少,但通常足够).
我也想过这样做:
strtolower(substr(crypt(uniqid(rand(),true)),7));
但是根据PHP网站,如果uniqid()在同一微秒内调用两次,那么uniqid()可能会生成相同的密钥.我认为添加rand()它很少会,但仍然可能.
在上面提到的行之后,我也删除了诸如L和O之类的字符,所以对用户来说并不那么困惑.这可能是重复的原因的一部分,但仍然是必要的.
我想到的一个选择是创建一个将生成密钥的网站,将其存储在数据库中,确保它完全独一无二.
有其他的想法吗?有没有任何网站已经做到这一点有某种API或只是返回键.我发现http://userident.com,但我不知道键是否完全独特.
>使用有效的GUID生成器 – 这些长度不能缩小.如果你只使用部分你失败.
>从单个序列顺序生成数字的至少一部分.您可以添加绒毛或编码,使其看起来不那么顺序.它们的优势是开始很短 – 缺点是需要单一来源.单个源限制的工作是编号,所以你包含[source#] [seq#],然后每个源可以生成自己的序列.
>通过其他方法生成它们,然后根据以前生成的值的单个历史进行检查.
任何其他方法不保证.请记住,从根本上说,您正在生成一个二进制数(它是一台计算机),但是您可以将其编码为十六进制,十进制,Base64或单词列表.选择适合您使用的编码.通常对于用户输入的数据,您需要一些Base32(您暗示的)变体.
关于GUIDS的注意事项:他们从他们的长度和用于产生它们的方法中获得了唯一性的强度.任何小于128位都不安全.除了随机数生成之外,还有一些特性可以转化为GUID,使其更加独特.请记住,它们只是几乎是独一无二的,而不是完全独特的.这是可能的,虽然几乎不可能有一个副本.
更新了关于GUIDS的注意事项:自写入以来,我了解到许多GUID生成器使用加密安全的随机数生成器(很难或不可能预测生成的下一个数字,并且不太可能重复).实际上有5个不同的UUID algorithms.算法4是Microsoft当前用于Windows GUID生成API的算法4. AGUID是Microsoft实施的UUID标准.
更新:如果你想要7到16个字符,那么你需要使用方法2或3.
底线:坦白说,没有完全独特的东西.即使你使用顺序发生器,你最终会用完宇宙中的所有原子,从而循环回收自己,重复一遍.你唯一的希望就是到达这个时刻宇宙的热死亡.
即使最好的随机数生成器也可能重复等于您生成的随机数的总大小.以四分之一为例.它是一个完全随机的位发生器,其重复的几率是1/2.
所以这一切都归结于你的唯一性的门槛.您可以通过使用一个序列,然后base32编码,可以获得1,099,511,627,776个数字的8位数字的100%唯一性.不涉及检查过去数字列表的任何其他方法仅具有等于n / 1,776(其中n =生成的先前数字的数量)不为唯一的几率.