【问题标题】:Shortest hash? MD5 / SHA . First chars, git最短的哈希? MD5/沙。第一个字符,git
【发布时间】:2014-03-19 12:18:33
【问题描述】:

我需要哈希函数。用户会将这些哈希写入计算机,因此哈希应该很短。 我将在数据库中有大约 50 000 000 条记录。每个都必须有自己的哈希。我想拥有唯一的哈希值。但是,如果一些记录具有相同的哈希值,我可以接受。独特的更好。

MD2 对我来说很安全,但哈希很长:“8350e5a3e24c153df2275c9f80692773” - 32 个字符。如果你必须在键盘上写 10 个 MD2 哈希,你会不高兴...

Git 对每个提交使用 SHA1(40 个字符)。但在输出中只显示前 7 个字符:

$ git log
commit e2cfc89fae5b43594b2c649fd4c05bcc6d2d12ac
...
commit 56a8b4c50d4269dc3f88727472933fd81231f63b
...
commit ce2e9ddbe896b9592abbd5fcb6604b181809d523
...
commit 498c49833516ea33b6a40697634ea6e3cfd62328
...
commit b7d78aea415e64d8d441f9747fe6d5d48fe54ee5

$ git log --oneline | head -n 5
e2cfc89 commnit message...
56a8b4c commnit message...
ce2e9dd commnit message...
498c498 commnit message...
b7d78ae commnit message...

它如何安全/独特?例如,如果我将使用 MD5/SHA-1/SHA-256 中的前 5 或 10 个字符,是否足够安全?

谢谢。

【问题讨论】:

    标签: git hash md5 sha


    【解决方案1】:

    查看hashids,它旨在根据您的主键(或其他一组唯一数字)生成唯一的 YouTube 风格哈希。从 MD5 和 SHA-1 的意义上说,它并不是真正的哈希,因为它被设计为可逆的。

    例如,如果你想“散列”你的单个整数主键,你可能会得到这样的关系

    (PK: 1) <=> (hashid: 8dY0qQ)
    

    这是从您控制的秘密值中生成的,因此用户无法确定他们真正引用的主键。如果您的数据库涉及更多,例如使用多个分片和复杂的键,您仍然可以。 hashids 将整数列表作为输入:

    (3, 171, 24) <=> (243j7Z)
    

    作为开发人员,您负责定义散列的最小长度。随着您生成的哈希值越来越多,hashids 可能会生成稍长的哈希值。

    对于给定的输入,哈希保证是唯一的(初始种子、最小哈希长度和要哈希的整数列表):

    没有冲突。您生成的哈希值应该是唯一的。

    支持

    • JavaScript
    • 红宝石
    • Python
    • Java
    • PHP
    • Perl
    • CoffeeScript
    • Objective-C
    • 卢阿
    • Node.js
    • .NET

    【讨论】:

      【解决方案2】:

      默认情况下,git 只显示 7 个字符,因为它很可能是唯一的,您可以使用足够的字符来引用提交/blob 来将其定义为唯一的。

      但是,在底层它仍然使用完整的哈希。如果你的 git 树有两个前 7 个数字相同的提交,那么如果你只使用 7 个字符来标识其中一个提交,它将引发错误。

      如果用户正在输入系统已经知道的数据的哈希值,则允许用户输入他认为需要的任意数量的字符,如果这不足以唯一地识别他正在谈论的哈希值,然后出错并提示更多。

      7 个十六进制字符给出了 ~ 2x10^7 个可能的哈希值。假设您使用的是良好的散列 - 即它在值之间分布均匀,然后通过平方近似,您有 50% 的机会在 ~19k* 散列后重复。您是否可以接受这取决于您插入的数量

      *对于N 十六进制字符的哈希,获得 50% 的哈希冲突机会的插入数约为 0.5+sqrt(0.25-(2xln(0.5)x16^N))

      【讨论】:

      • 我知道,git 使用前 7 个字符只是为了简化。对于唯一标识,仍然使用完整的 SHA-1 哈希。是否很有可能会有更多具有相同前 7 个字符的相同哈希?
      • 感谢您的回复。如果我对“123”使用 SHA256 哈希,则为“a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3”。最好是获取前 8 个字符,还是获取例如每 8 个字符?你这是什么意思?
      • 你选择的字符应该没有区别。
      猜你喜欢
      • 2012-10-10
      • 2012-08-17
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多