最短的哈希? MD5 / SHA。第一个字符,git

时间:2014-02-19 09:18:36

标签: git hash md5 sha

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

MD2对我来说是安全的,但哈希很长:“8350e5a3e24c153df2275c9f80692773” - 32个字符。如果你必须在keybord上写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个字符是否足够安全?

谢谢。

2 个答案:

答案 0 :(得分:9)

查看hashids,它旨在通过主键(或其他一组唯一数字)生成唯一的YouTube样式哈希值。从MD5和SHA-1的意义上来说,它并不是真正的哈希,因为它的设计是可逆的。

举个例子,如果你想“散列”你的单个整数主键,你可能会得到像

这样的关系。
(PK: 1) <=> (hashid: 8dY0qQ)

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

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

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

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

  

无碰撞。生成的哈希值应该是唯一的。

支持

  • 的JavaScript
  • 红宝石
  • 的Python
  • 爪哇
  • PHP
  • 的Perl
  • 的CoffeeScript
  • 目标C
  • 开始
  • 的Lua
  • Node.js的
  • .NET

答案 1 :(得分:6)

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

然而,在引擎盖下它仍然使用完整哈希。如果您的git树有两个具有相同前7个数字的提交,那么如果您只使用7个字符来识别其中一个提交,则会抛出错误。

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

7个十六进制字符可提供~2x10 ^ 7个可能的哈希值。假设你正在使用一个好的哈希值 - 即它在值上有均匀的分布,那么通过平方近似,你有大约50%的机会在~19k *哈希之后重复。这是否可以接受取决于您插入的数量

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