为什么在定义hashcode时要使用31这个数呢?
2016-10-27 18:12
260 查看
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
该函数是我看的函数接口源码,为什么要使用31这个数呢?
其实上面的实现也可以总结成数数里面下面这样的公式:
s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
原因如下:
A.31是一个素数,素数作用就是如果我用一个数字来乘以这个素数,那么最终的出来的结果只能被素数本身和被乘数还有1来整除!。(减少冲突)
B.31可以 由i*31== (i<<5)-1来表示,现在很多虚拟机里面都有做相关优化.(提高算法效率)
C.选择系数的时候要选择尽量大的系数。因为如果计算出来的hash地址越大,所谓的“冲突”就越少,查找起来效率也会提高。(减少冲突)
D.并且31只占用5bits,相乘造成数据溢出的概率较小。
顶
2
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
该函数是我看的函数接口源码,为什么要使用31这个数呢?
其实上面的实现也可以总结成数数里面下面这样的公式:
s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
原因如下:
A.31是一个素数,素数作用就是如果我用一个数字来乘以这个素数,那么最终的出来的结果只能被素数本身和被乘数还有1来整除!。(减少冲突)
B.31可以 由i*31== (i<<5)-1来表示,现在很多虚拟机里面都有做相关优化.(提高算法效率)
C.选择系数的时候要选择尽量大的系数。因为如果计算出来的hash地址越大,所谓的“冲突”就越少,查找起来效率也会提高。(减少冲突)
D.并且31只占用5bits,相乘造成数据溢出的概率较小。
顶
2
相关文章推荐
- 为什么在定义hashcode时要使用31这个数呢?
- 为什么在定义hashcode时要使用31这个数呢?
- 为什么在定义hashcode时要使用31这个数呢?
- 为什么在定义hashcode时要使用31这个数呢
- 为什么在定义hashcode时要使用31这个数呢?
- 为什么在定义hashcode时要使用31这个数?
- 为什么在定义hashcode时要使用31这个数呢?
- 转:为什么在定义hashcode时要使用31这个数呢?
- [转载]关于定义hashcode时要使用31这个数的解释
- 为什么在中断向量表中不直接LDR PC ,"异常地址"。而是使用一个标号,然有再在后面使用 DCD定义这个标号
- 定义hashcode时使用31系数的原因
- 【转载】关于hashcode里面使用31系数的问题
- 这个程序中为什么出错???为什么不能把nl,nr定义为全局变量,求大神指教
- Java 重写hashCode() 时为什么要用 31 来计算
- 这个textview有问题吗 为什么一使用就崩溃
- 【解答】OpenGL 定义顶点和顶点颜色时为什么都用0x10000这个值
- 看到这个你能明白很多为什么要定义new,为什么函数不要定义
- 为什么使用FindFirstVolume的时候,会报“error C2065: 'FindFirstVolume' : undeclared identifier”这个错误呢?????
- 为什么要在定义抽象类时使用abstract关键字
- 【解答】OpenGL 定义顶点和顶点颜色时为什么都用0x10000这个值