这对你来说有点难题:如果你使用像CRC-64那样的哈希算法,那么读取一个字符串需要多少字节才能计算好哈希?让我们说你的所有字符串至少2 KB长,然后使用整个字符串计算缓存似乎是浪费或资源,但你认为多少个字符就足够了?只有8个ASCII字符就足够了,因为它等于64位吗?不使用超过8个ASCII字符只是毫无意义?我想知道你的意思。
更新: 使用'良好散列',我指的是通过使用更多字节来计算散列冲突的可能性不会减少的点。
答案 0 :(得分:2)
如果使用超过8个字节或更少的CRC-64,则使用CRC-64没有任何意义:只需“按原样”使用8个字节。除非输入长于预期输出,否则CRC没有任何附加值。
作为一般规则,如果您的哈希函数的输出为 n 位,那么一旦累积了约2 n / 2 < n / 2 < / sup>字符串。简而言之,如果使用64位,那么在前2亿个字符串中遇到冲突是不太可能的。如果你得到一个160位或更多的输出,那么碰撞实际上是不可行的(你会遇到比硬件故障少得多的碰撞,例如CPU着火)。这假设散列函数是“完美的”。如果你的哈希函数首先选择几个数据字节,那么,你做不选择的字节必然会对哈希输出产生任何影响,所以你最好使用“好”的字节 - 这完全取决于你正在散列的字符串的类型。这里没有一般规则。
我的建议是首先尝试在整个字符串上使用泛型哈希函数;我通常建议MD4。 MD4是一个加密的哈希函数,它已被彻底打破,但对于没有涉及安全性的问题,它仍然非常擅长混合数据元素(加密方面,CRC比MD4破坏得多)。据报道MD4在某些平台上实际上比CRC-32更快,所以你可以试一试。在基本的PC(我的2.4 GHz Core2)上,MD4实现的工作速度大约为700 MB / s,所以我们说的是每秒35000个哈希2 kB字符串,这也不错。
答案 1 :(得分:1)
两个不同字符串的前8个字母相同的几率是多少?这取决于这些字符串是什么,它可能非常高,在这种情况下你肯定得到哈希冲突。
哈希整个事情。几千字节是没有的。除非你实际上需要在你的程序中保存纳秒,否则不要对整个字符串进行散列将是过早的优化。