Hash 我应该读多少个字符串才能得到一个好的散列?

Hash 我应该读多少个字符串才能得到一个好的散列?,hash,crc,crc64,Hash,Crc,Crc64,这里有一个小难题:如果您使用像CRC-64这样的散列算法,那么为了计算好的散列,需要读取字符串中的多少字节?假设所有字符串的长度至少为2kb,那么使用整个字符串来计算缓存似乎是一种浪费或资源,但您认为多少个字符就足够了?既然它等于64位,那么仅仅8个ASCII字符就足够了吗?使用超过8个ASCII字符难道不是毫无意义吗?我想知道你对此的看法 更新: “好的散列”指的是,通过使用更多字节来计算,散列冲突的可能性不会降低。两个不同字符串的前8个字母相同的可能性有多大?取决于这些字符串是什么,它可能非

这里有一个小难题:如果您使用像CRC-64这样的散列算法,那么为了计算好的散列,需要读取字符串中的多少字节?假设所有字符串的长度至少为2kb,那么使用整个字符串来计算缓存似乎是一种浪费或资源,但您认为多少个字符就足够了?既然它等于64位,那么仅仅8个ASCII字符就足够了吗?使用超过8个ASCII字符难道不是毫无意义吗?我想知道你对此的看法

更新:
“好的散列”指的是,通过使用更多字节来计算,散列冲突的可能性不会降低。

两个不同字符串的前8个字母相同的可能性有多大?取决于这些字符串是什么,它可能非常高,在这种情况下,您肯定会遇到哈希冲突


把整件事都搞糟。几千字节算不了什么。除非您确实需要在程序中节省纳秒,否则不对完整字符串进行哈希运算将是过早的优化。

如果您使用的CRC-64大于或小于8字节,则使用CRC-64没有任何意义:只需按原样使用8字节即可。CRC没有任何附加值,除非输入长于预期输出

一般来说,如果散列函数的输出为n位,那么一旦累积了大约2n/2个字符串,就会开始出现冲突。简而言之,如果使用64位,那么在前20亿个字符串中不太可能遇到冲突。如果您得到160位或更多的输出,那么冲突实际上是不可行的,您将遇到比硬件故障(如CPU着火)少得多的冲突。这假设哈希函数是完美的。如果您的哈希函数以选择几个数据字节开始,那么,不选择的字节必然不会对哈希输出产生任何影响,因此您最好使用好的字节,这完全取决于您正在哈希的字符串类型。这里没有一般规则


我的建议是首先尝试在整个字符串上使用通用哈希函数;我通常推荐。MD4是一个加密散列函数,它已经完全被破坏了,但是对于一个不涉及安全性的问题来说,它仍然非常擅长以加密方式混合数据元素,CRC比MD4更容易破坏。据报道,在某些平台上,MD4实际上比CRC-32快,所以您可以尝试一下。在基本PC上,我的2.4 GHz Core2上,MD4实现的速度约为700 MBytes/s,因此我们讨论的是每秒35000个散列2 kB字符串,这还不错。

如果我需要优化,那么如果在整个字符串上分布8个字节会怎么样。如果字符串是8kb,那么我将每KB获得第一个字节,以分散散列生成的字节。您真的需要优化吗?你是在实现硬件或驱动程序还是什么?没有一个消费者应用程序需要这种优化。像你这样的程序员为什么选择混淆实际情况,而不是站在前面?而不是是/否,也许?你需要情境建议,但不会提供情境。这就好像你故意选择浪费别人的时间,而不是提供一条阻力最小的正确答案。对不起,先生。我无意冒犯你或以任何方式浪费你的时间。这是一个自定义的B+树哈希算法,我已经用C++编写了。我的回答可能是因为我问的问题大多是好奇,而不是必要性。谢谢你的帮助。好的,所以8个字符对于生成哈希是没有意义的。但是如果我使用32个字符,而不是16个字符,那么哈希值是否更随机?随机性的好处会消失多少个字符?