猿问

字符串的良好哈希函数

字符串的良好哈希函数

我正在尝试为字符串设想一个好的哈希函数。而且我认为总结字符串中前五个字符的unicode值可能是一个好主意(假设它有五个,否则在它结束时停止)。这是一个好主意,还是一个坏主意?

我在Java中这样做,但我不认为这会产生很大的不同。


慕斯709654
浏览 344回答 3
3回答

30秒到达战场

通常哈希不会做算术,否则stop和pots将具有相同的哈希值。并且你不会将它限制在前n个字符,因为否则房屋和房屋将具有相同的哈希值。通常,散列取值并乘以素数(使其更有可能生成唯一的散列)所以你可以这样做:int&nbsp;hash&nbsp;=&nbsp;7;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;strlen;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;hash&nbsp;=&nbsp;hash*31&nbsp;+&nbsp;charAt(i);}

阿波罗的战车

您应该使用String.hashCode()。如果你真的想自己实现hashCode:不要试图从哈希码计算中排除对象的重要部分以提高性能 - Joshua Bloch,Effective Java仅使用前五个字符是个坏主意。考虑层次名称,例如URL:它们都将具有相同的哈希码(因为它们都以“http://”开头,这意味着它们存储在哈希映射中的同一个桶中,表现出糟糕的性能。这是一篇关于来自“&nbsp;Effective Java&nbsp;”&nbsp;的String hashCode的战争故事:在1.2之前的所有版本中实现的String散列函数检查最多16个字符,在整个字符串中均匀分布,从第一个字符开始。对于大型分层名称集合(例如URL),此哈希函数显示可怕的行为。
随时随地看视频慕课网APP

相关分类

Java
我要回答