zoukankan      html  css  js  c++  java
  • 魔数常量

     

     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.

  • 相关阅读:
    laravel5.6 调用第三方类库
    substring
    SpringSecurity3配置及原理简介
    正则表达式
    type=json
    正则表达式2
    笔记1
    oracle 自带函数大全及例子
    Vector容器类
    HQL
  • 原文地址:https://www.cnblogs.com/hoys/p/2378411.html
Copyright © 2011-2022 走看看