关于常见哈希函数的疑问,求大神解惑!!

BeyondQqiang 2016-06-07 02:08:17
我查看了所有比较经典的常用哈希函数的实现,在最后返回哈希值的时候它们都使用了:


return (hash & 0x7FFFFFFF);


这种做法我看了一下是将哈希值限制在 31 位,但是一般哈希的值是 unsigned int 型也就是有 32 位,那么这里限制在 31 位不知道有什么特殊的用意。

请大家帮忙解释一下,多谢!
...全文
302 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我认为不仅仅是要让index为正数,还要在计算散列时h(k) = k mod m中的k尽量分散,减少碰撞的发生吧
吃饱了想睡 2018-12-15
  • 打赏
  • 举报
回复
本质是去除hashcode的符号
BeyondQqiang 2016-06-08
  • 打赏
  • 举报
回复
引用 6 楼 qq423399099 的回复:
第一个问题:是的,如果第一位大于7,意味着二进制第一位相与以后可能会出现1 第二个问题:malloc只是申请一片连续的内存空间,主要和你用什么来接收这个申请的内存首地址有关
OK,了解了。多谢
小灸舞 版主 2016-06-08
  • 打赏
  • 举报
回复
第一个问题:是的,如果第一位大于7,意味着二进制第一位相与以后可能会出现1
第二个问题:malloc只是申请一片连续的内存空间,主要和你用什么来接收这个申请的内存首地址有关
BeyondQqiang 2016-06-08
  • 打赏
  • 举报
回复
引用 2 楼 qq423399099 的回复:
关键在于一个对象的 HashCode可以为负数,这样操作后可以保证它为一个正整数 0x7FFFFFFF is 0111 1111 1111 1111 1111 1111 1111 1111 : all 1 except the sign bit. (hash & 0x7FFFFFFF) 将会得到一个正整数 因为你的hash是要作为数组的index的,这样可以避免出现下标为负数而出现异常
在这里顺便再问你一个问题,就是对于动态数组形式比如说: int **arr; 这种形式可以解释成是 int 型的二维数组,也可以解释成是 int * 型的一维数组,那么在 c 中是怎么分辨到底应该解释成那种形式呢?是根据 malloc 的时候 sizeof(类型) 这里确定吗?
BeyondQqiang 2016-06-08
  • 打赏
  • 举报
回复
引用 2 楼 qq423399099 的回复:
关键在于一个对象的 HashCode可以为负数,这样操作后可以保证它为一个正整数 0x7FFFFFFF is 0111 1111 1111 1111 1111 1111 1111 1111 : all 1 except the sign bit. (hash & 0x7FFFFFFF) 将会得到一个正整数 因为你的hash是要作为数组的index的,这样可以避免出现下标为负数而出现异常
引用错了。。。 得到正整数是因为二进制第一位是 0 是吗? 因为如果第一位大于 7 的话二进制的第一位会变成 1,1 的话同负数进行 & 运算还是负数。
BeyondQqiang 2016-06-08
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
0x7FFFFFFF 是质数,0xFFFFFFFF 不是
得到正整数是因为二进制第一位是 0 是吗? 因为如果第一位大于 7 的话二进制的第一位会变成 1,1 的话同负数进行 & 运算还是负数。
小灸舞 版主 2016-06-07
  • 打赏
  • 举报
回复
关键在于一个对象的 HashCode可以为负数,这样操作后可以保证它为一个正整数
0x7FFFFFFF is 0111 1111 1111 1111 1111 1111 1111 1111 : all 1 except the sign bit.
(hash & 0x7FFFFFFF) 将会得到一个正整数
因为你的hash是要作为数组的index的,这样可以避免出现下标为负数而出现异常
lm_whales 2016-06-07
  • 打赏
  • 举报
回复
0x7FFFFFFF 是质数,0xFFFFFFFF 不是

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧