最短散列?MD5/SHA。第一个chars,git

最短散列?MD5/SHA。第一个chars,git,git,hash,md5,sha,Git,Hash,Md5,Sha,我需要散列函数。用户将把这些散列写入计算机,所以散列应该很短。 我将在数据库中有大约50000条记录。每个都必须有自己的散列。我想有唯一的散列。但如果有一点记录有相同的散列,我可以接受。独一无二更好 MD2对我来说很安全,但哈希很长:“8350e5a3e24c153df2275c9f80692773”-32个字符。如果你必须在keybord上写10MD2哈希,你会不高兴 Git对每个提交使用SHA1(40个字符)。但在输出中仅显示前7个字符: $ git log commit e2cfc89fa

我需要散列函数。用户将把这些散列写入计算机,所以散列应该很短。 我将在数据库中有大约50000条记录。每个都必须有自己的散列。我想有唯一的散列。但如果有一点记录有相同的散列,我可以接受。独一无二更好

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

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仅显示7个字符,因为它很可能是唯一的,并且您可以使用足够的字符将其定义为唯一的提交/blob

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

如果用户正在输入系统已经知道的数据的散列,则允许用户输入他认为需要的任意多的字符,如果这不足以唯一标识他正在谈论的散列,则会出错并提示输入更多字符

7个十六进制字符提供~2x10^7个可能的哈希值。假设您使用的是一个好的散列,即它在值之间的分布是均匀的,那么通过平方近似,在~19k*个散列之后,您有50%的几率出现重复。这是否为您所接受取决于插入的数量

*对于
N
十六进制字符的散列,获得50%散列冲突几率的插入数约为
0.5+sqrt(0.25-(2xln(0.5)x16^N))
签出,其设计用于从主键(或其他一组唯一数字)生成独特的YouTube风格散列。从MD5和SHA-1的意义上讲,它不是真正的散列,因为它被设计为可逆的

例如,如果要“散列”单个整数主键,可能会得到如下关系

(PK: 1) <=> (hashid: 8dY0qQ)
作为开发人员,您负责定义散列的最小长度。随着生成越来越多的散列,
hashids
可能会生成稍长的散列

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

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

有人支持

  • JavaScript
  • 红宝石
  • 蟒蛇
  • 爪哇
  • PHP
  • Perl
  • 咖啡脚本
  • 目标-C
  • 卢阿
  • Node.js
  • .NET

我知道,git使用前7个字符只是为了简化。对于唯一标识,仍然使用完整的SHA-1散列。这是一个很强的可能性,将有更多的相同的哈希相同的前7个字符?谢谢你的答复。如果我对“123”使用SHA256哈希,则为“A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7F7A27AE3”。最好是获得前8个字符,或者每8个字符获得一个字符?你这是什么意思?你选择的角色应该没有区别。
(3, 171, 24) <=> (243j7Z)