JAVA HASH学习
就HASH的目的来说,是为了解决内容摘要与快速索引的问题;而其算法也比较多样。
JDK实现中,对String类的hashcode()进行了重载:
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
其中最重要的代码是:h = 31 * h + val[i];
为什么偏偏是31?不是29?不是37?更不是与之类似的127?
这篇文章说得有一定的意思,但是并未彻底解释清楚当初选31作为因子:http://donlianli.iteye.com/blog/1979674
下面的探讨也有一点参考意义:http://www.javamex.com/tutorials/collections/hash_function_technical_2.shtml
但终究还是没看到有任何文章彻底的解释清楚,为什么要选中31!
浙公网安备 33010602011771号