SHA256 末 8 位、SHA512 末 8 位、CRC32 全 8 位 在对原文进行小幅修改后哪个更不容易无意重复?只有 8 位的情况下有意碰撞都很容易,因此不考虑有意碰撞的情况

82 天前
 drymonfidelia
1120 次点击
所在节点    程序员
7 条回复
dhb233
82 天前
虽然不知道哪个效果更好,但是你这说的是 32 位吧。。。
dode
82 天前
八个字母还是八个字节,Base64 重新编码一下存的更多
bigfei
82 天前
感觉 CRC32 更好,GPT4 回答如下:

所有三种哈希函数( SHA256 ,SHA512 和 CRC32 )都被设计为对输入的微小变化做出显著反应,这种属性被称为雪崩效应。在对输入变化的敏感性方面,像 SHA256 和 SHA512 这样的加密哈希函数被设计为即使在输入的单个比特差异下也会发生剧变。虽然 CRC32 不是加密哈希,但它也具有良好的雪崩效应,用于错误检测。

然而,如果我们只考虑哈希输出的最后 8 个字母数字字符,由于输出空间的减小,对变化的敏感性变得更微妙。这是因为我们将哈希输出截断到较小的大小,这增加了冲突的可能性(不同的输入产生相同的输出)。

从信息理论的角度来看,考虑到每个字母数字字符可以代表 16 个可能的值(因为我们使用十六进制表示),所以 8 个字符代表$16^8$或约 43 亿的可能性。

鉴于此,如果我们严格地谈论对小输入变化的敏感性,CRC32 可能实际上在最后 8 个字符中显示出最大的变化,因为它的整个输出空间都适合这 8 个字符。另一方面,SHA256 和 SHA512 有更大的输出空间,所以输入的小变化可能会导致哈希输出的其他部分发生变化,而不一定是最后 8 个字符。

但是需要注意的是,这并不意味着 CRC32 在更广泛的意义上是"更好"的。它不适合安全敏感的应用,甚至在对变化的敏感性方面,将像 SHA256 或 SHA512 这样的加密哈希截断到最后 8 个字符也不是理想的做法。
tool2d
82 天前
写一个程序测一下就知道了,但是 8 位很容易碰撞。

我以前写过一些测试代码,碰撞差距不大,区别大的是计算时间。

哈希算法 A, 2000 万随机数,冲撞 count=46571, time=8.877379
哈希算法 B, 2000 万随机数,冲撞 count=45767, time=8.6227
哈希算法 C, 2000 万随机数,冲撞 count=46186, time=7.530662
哈希算法 D, 2000 万随机数,冲撞 count=44959, time=21.00468
哈希算法 E, 2000 万随机数,冲撞 count=46506, time=8.168545
哈希算法 F, 2000 万随机数,冲撞 count=46430, time=7.029362
哈希算法 G, 2000 万随机数,冲撞 count=46205, time=7.259135
mxT52CRuqR6o5
82 天前
我感觉 CRC32 最容易无意重复吧,修改正好抵消就重复了
cnbatch
82 天前
CRC32“全 8 位”? CRC8 才是全 8 位呀,CRC32 明明是全 32 位。
我猜 OP 是想表达 16 进制时的“8 个字母”吧。

如果是真实的“全 8 位”,而不是 OP 所指的“8 个字母”,那么无论怎么选都很容易重复。
drymonfidelia
82 天前
@cnbatch 8 位 16 进制,说错了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1019776

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX