使用hash表时,计算hash值,为什么常常选取一个素数,然后对除以这个素数取余,一般的整数不行吗?

longj 2004-08-09 09:49:18
如下,使用素数作为hash表容量,算出来的值还要对这个素数取余,
难道普通整数不行么? 比如10000,8888

inline long hash_fun1(const std::string& c, const long prime)
{
int n = c.length();
const char* d = c.c_str();
long h = 0;

for (int i = 0; i < n; ++i, ++d)
h = (h << 2) + *d;

return ((h >= 0) ? (h % prime) : (-h % prime));
}
...全文
561 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
longjj 2004-08-11
  • 打赏
  • 举报
回复
居然没人知道!中国软件出路何在?
longjj 2004-08-10
  • 打赏
  • 举报
回复
关注!
memory_xj 2004-08-09
  • 打赏
  • 举报
回复
Hash的关键在于散列函数。关键是均匀地将关键码散开,关于为什么要用素数作为散列数组的大小,我就给出一本权威的书《程序设计实践》中的原话:“用素数作为散列数组的大小是比较明智的,因为这样能保证在数组大小,散列的乘数和可能的数据值之间不存在公因子”,至于其间的奥秒我也没时间深究。
bluwindhrt 2004-08-09
  • 打赏
  • 举报
回复
帮顶一下——这个问题我也有想过,有全面一点的解释吗?
PS:偶数学差来着!嘻嘻!
Magnus 2004-08-09
  • 打赏
  • 举报
回复
我记得在MSDN上有阿
Magnus 2004-08-09
  • 打赏
  • 举报
回复
普通整数也行的
效率不好而已

由统计学原理,得出需要素数
还必须大于常用大小20%的样子
sohou 2004-08-09
  • 打赏
  • 举报
回复
看数据结构,哈哈,数学问题

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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