linux

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

 unsigned long hash_long(unsigned long val, unsigned int bits) 
   { 
        unsigned long hash=val *0x9e370001UL; 
        return hash>>(32-bits); 
   } 
    0x9e370001=2 654 404 609=2^31+2^29-2^25+2^22-2^19-2^16+1. 
    是接近黄金比例的2^32的一个素数。(也称为 “魔数常量”) 

也许你会想常量 0x9e370001(=2654 404 609)究竟是怎么得出来的。这种散列函数是基于表索引乘于一个适当的大数,于是结果溢出,就把留在32位变量中的值作为模数操作的结果。Knuth建议,要得到满意的结果,将2^32做黄金分割,这个大数是最接近黄金分割的素数。

2654 404 609就是接近2^32*(5开方-1)/2的一个素数,这个数可以方便地通过加运算和位移运算得到,因为等于:2^31+2^29-2^25+2^22-2^19-2^16+1.

posted on 2012-03-03 16:07  h13  阅读(1314)  评论(0编辑  收藏  举报