【问题标题】:Algorithm to generate unique (possibly auto incremented) ids生成唯一(可能自动递增)ID 的算法
【发布时间】:2011-01-10 09:58:10
【问题描述】:

我需要为我的应用程序生成唯一 ID,并且我正在寻找合适的算法。我更喜欢这样的东西--

YYYY + MM + DD + HH + MM + SS + <random salt> + <something derived from the preceding values>

F.ex. -

20100128184544ewbhk4h3b45fdg544

我正在考虑使用SHA-256 或其他东西,但结果字符串不应该太长。我可以使用UUID,但同样,它们太长了,而且只能在一台机器上保证它们是唯一的。

我欢迎提出建议和想法。我的编程语言是 Java。

编辑: id 不需要是加密安全的。我正在研究更简单的散列算法,例如 Dan Bernstein 的散列算法等。

【问题讨论】:

  • UUID 保证普遍是唯一的。它使用算法中的 MAC 地址来确保没有两台机器生成相同的 UUID。
  • GUID 有什么问题?它并不比您给出的示例长多少,并且 GUID 是唯一的
  • @Kenny:Afaik 没有人使用第一个版本(具有 MAC 地址的版本)了。无论如何,这有点离题,因为现在许多 NIC 都有用户可配置的 MAC 地址。我今天看到的大多数 UUID 都是第 4 版。
  • 虽然算法试图确保 UUID / GUID 是唯一的,但它可能发生的数学百分比机会,但它在十亿分之一的范围内。 MAC 地址组件在算法的后续变体中被删除,以防止 GUID 被追溯到 Mac 地址 - 它造成了隐私问题。
  • 严格来说,不可能生成 保证唯一 值,因为可以构造无限数量的对象(并且存储生成的 id 的空间有限) -您正在寻找具有足够熵以实际上唯一的东西,为此我会使用 UUID(如果我需要它作为文本表示形式更短一些,则使用 base64 对其进行编码)

标签: algorithm unique uniqueidentifier random


【解决方案1】:

您可以使用该 SHA-256,然后仅从结果中获取前 10 个字节(或者您喜欢多少字节,平衡长度和唯一性,但您喜欢)。

【讨论】:

    【解决方案2】:

    所以我终于解决了这个问题-

    d = YYYYMMDDHHMMSS
    hash = d + sha256(d + random_salt)[:10]
    

    谢谢大家的回复。

    【讨论】:

    • 您最好删除日期前缀并向 sha 子字符串添加另外 14 个字符 - SHA256 输出的每个字符都比 datetime 字符添加更多的熵。
    【解决方案3】:

    试试这个:

    java.security.messageDigest()
    

    【讨论】:

    • 哪个是运行 MD5 或 SHA-1 的另一种方式,不是吗?
    【解决方案4】:

    我认为如果您使用 SHA1(MD5(YYYYMMDDHHMMSS + YourSystemName + ClientName)) 40 个字符就可以了.. ;)

    【讨论】:

    • SHA1(MD5(...)) 没用;如果您要沿着这条路线走,只需使用 SHA1。
    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多