Hash 散列大小有界的字符串

Hash 散列大小有界的字符串,hash,cryptography,computer-science,sha1,Hash,Cryptography,Computer Science,Sha1,假设我有一个最大长度为64个字符的有界输入字符串[0-9,a-z,a-z]。给定使用sha1哈希的以下代码: var hash = sha1(str).substring(0,n) 我想最小化整数n,同时仍然可以接受地避免冲突 如何计算给定n和输入集大小x的碰撞概率?没有长度可以保证不会发生任何碰撞。即使是完整的20字节SHA-1也不能保证没有碰撞:制造碰撞在计算上是昂贵的,但是)。即使是64字节的SHA-512值也不能从数学上保证没有碰撞,但最著名的发现碰撞的方法需要比太阳系中更多的能量 如

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

var hash = sha1(str).substring(0,n)
我想最小化整数n,同时仍然可以接受地避免冲突


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

没有长度可以保证不会发生任何碰撞。即使是完整的20字节SHA-1也不能保证没有碰撞:制造碰撞在计算上是昂贵的,但是)。即使是64字节的SHA-512值也不能从数学上保证没有碰撞,但最著名的发现碰撞的方法需要比太阳系中更多的能量

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

但是如果这是为了索引而不是为了安全,哈希通常不是确保没有冲突的实用方法。改为使用非加密哈希。非加密散列使创建冲突变得容易,但计算速度更快。如果发生冲突,请使用二次哈希、排序数据结构中的二进制搜索或线性搜索来解决歧义。这就是散列表等数据结构的工作方式

有一种情况可以确保没有冲突:使用固定数据集时。在这种情况下,您可以根据数据计算a


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

你怎么看。分享你的发现。嗯,数学<代码>概率=设置长度/64**n定义“避免碰撞”?