散列一串有界大小的字符串

时间:2018-02-06 20:54:23

标签: hash cryptography computer-science sha1

假设我有一个最大长度为64个字符的有界输入字符串[0-9,a-z,A-Z]。给出以下使用sha1哈希的代码:

var hash = sha1(str).substring(0,n)

我想最小化整数 n ,同时仍然可以避免碰撞。

如何计算 n 和输入集大小 x 的碰撞概率?

1 个答案:

答案 0 :(得分:1)

没有长度可以保证不会发生任何碰撞。即使完整的20字节SHA-1也不能保证不会发生冲突:制造冲突的计算成本很高,但是it has been done)。即使是64字节的SHA-512值也不能提供没有碰撞的数学保证,但找到碰撞的最有名的方法需要比太阳系中更多的能量。

如果你想要一个没有冲突的实际保证(即使面对恶意输入),你也可以使用一个尚未被破坏的加密哈希,例如SHA-256。

但如果这是用于索引而不是安全性,则哈希通常不是确保没有冲突的实用方法。请改用非加密哈希。非加密哈希可以轻松地进行冲突,但计算速度更快。如果存在冲突,请使用辅助哈希,排序数据结构中的二进制搜索或线性搜索来解决模糊性。这就是哈希表等数据结构的工作原理。

有一种情况可以确保没有冲突:当您使用固定数据集时。在这种情况下,您可以从数据中计算perfect hash function

或者,散列可能是错误的工具。也许你应该保留一个中央索引数据库。