只有 3 种方法可以生成唯一值,它们是密码、用户 ID 等:
- 使用有效的 GUID 生成器 - 这些生成器很长并且不能缩小。如果你只使用部分你 FAIL。
- 至少部分数字是从单个序列中顺序生成的。您可以添加绒毛或编码以使其看起来不那么连续。优点是它们开始时间短 - 缺点是它们需要单一来源。解决单一来源限制的方法是对来源进行编号,因此您可以包含 [source #] + [seq #],然后每个来源都可以生成自己的序列。
- 通过其他方式生成它们,然后根据先前生成的值的单一历史记录检查它们。
不保证任何其他方法。请记住,从根本上说,您正在生成一个二进制数(它是一台计算机),但随后您可以将其编码为十六进制、十进制、Base64 或单词列表。选择适合您使用的编码。通常对于用户输入的数据,您需要一些 Base32 的变体(您暗示过)。
关于 GUIDS 的注意事项:它们从长度和用于生成它们的方法中获得了独特性的力量。 任何小于 128 位的内容都是不安全的。 除了随机数生成之外,GUID 还具有一些特性,使其更加独特。请记住,它们实际上只是唯一的,而不是完全唯一的。这是可能的,尽管实际上不可能有一个副本。
更新了关于 GUID 的说明:自从写这篇文章以来,我了解到许多 GUID 生成器使用加密安全的随机数生成器(很难或不可能预测下一个生成的数字,并且不太可能重复)。实际上有 5 种不同的UUID 算法。算法 4 是 Microsoft 当前用于 Windows GUID 生成 API 的算法。GUID是 Microsoft 对 UUID 标准的实现。
更新:如果你想要 7 到 16 个字符,那么你需要使用方法 2 或 3。
底线:坦率地说,没有完全独特的东西。即使你使用顺序生成器,你最终也会用完宇宙中所有的原子的存储空间,从而循环回到你自己并重复。你唯一的希望是在达到那个点之前宇宙的热寂。
即使是最好的随机数生成器也有可能重复等于您正在生成的随机数的总大小。以四分之一为例。它是一个完全随机的比特生成器,它的重复几率是 2 分之一。
所以这一切都归结为你的独特性门槛。通过使用序列,然后对其进行 base32 编码,您可以对 1,099,511,627,776 个数字具有 8 位数字的 100% 唯一性。任何其他不涉及检查过去数字列表的方法仅具有等于 n/1,099,511,627,776(其中 n = 生成的先前数字的数量)不唯一的几率。