青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

time33 哈希函數(shù),又叫 DJBX33A,Bernstein's hash

轉(zhuǎn)載自:http://www.cnblogs.com/napoleon_liu/articles/1911571.html

php, apache, perl, bsddb都使用time33哈希.

最簡單的版本

  uint32_t time33(char const *str, int len) 
    

        unsigned 
long  hash = 0
        
for (int i = 0; i < len; i++
            hash 
= hash *33 + (unsigned long) str[i]; 
        }
 
        
return hash; 
    }

 

這個版本最可以體現(xiàn)time33的算法思路,夠簡單。

 

把乘法操作換成位操作

        unsigned long time33(char const *str, int len) 
    

        unsigned 
long  hash = 0
        
for (int i = 0; i < len; i++
            hash 
= ((hash <<5+ hash) + (unsigned long) str[i]; 
        }
 
        
return hash; 
    }
 

59個字符1000 0000次運行(gcc沒有開啟優(yōu)化,因為開了優(yōu)化后兩個函數(shù)的實際代碼會一樣)

第一個:

real    0m4.389s 
user    0m4.388s 
sys     0m0.000s

 

第二個:

real    0m4.137s 
user    0m4.120s 
sys     0m0.000s

 

 

gcc –O2優(yōu)化后是

real    0m1.367s 
user    0m1.360s 
sys     0m0.000s

 

 

php版本

 

inline unsigned time33(char const*str, int len) 

     unsigned long hash 
= 5381
     
/* variant with the hash unrolled eight times */ 
     
for (; len >= 8; len -= 8) { 
         hash 
= ((hash << 5+ hash) + *str++
         hash 
= ((hash << 5+ hash) + *str++
         hash 
= ((hash << 5+ hash) + *str++
         hash 
= ((hash << 5+ hash) + *str++
        hash 
= ((hash << 5+ hash) + *str++
        hash 
= ((hash << 5+ hash) + *str++
        hash 
= ((hash << 5+ hash) + *str++
        hash 
= ((hash << 5+ hash) + *str++
    } 
    
switch (len) { 
        
case 7: hash = ((hash << 5+ hash) + *str++/* fallthrough */ 
        
case 6: hash = ((hash << 5+ hash) + *str++/* fallthrough */ 
        
case 5: hash = ((hash << 5+ hash) + *str++/* fallthrough */ 
        
case 4: hash = ((hash << 5+ hash) + *str++/* fallthrough */ 
        
case 3: hash = ((hash << 5+ hash) + *str++/* fallthrough */ 
        
case 2: hash = ((hash << 5+ hash) + *str++/* fallthrough */ 
        
case 1: hash = ((hash << 5+ hash) + *str++break
        
case 0: break
    } 
    
return hash; 

 

59個字符,1000 0000次

real    0m1.088s 
user    0m1.068s 
sys     0m0.000s

 

速度提升主要在循環(huán)展開, 對于短字符,這個是不明顯的。

php版本的hash初始值是5381, 這個

 

Magic Constant 5381:

  
1. odd number

  
2. prime number

  
3. deficient number

  
4001/010/100/000/101 b

 

Apache版本

unsigned long time33(char const  *str, int *len) 

    unsigned 
long hash = 0;

    
const char *p=str; 
    
if (*len<=0
        
for(p = str; *p; p++
            hash 
= hash * 33 + *p; 
        }
 
        
*len = p - str; 
    }
 
    
else 
        
int i = *len; 
        
for (p = str;i; i--, p++
            hash 
= hash * 33 + *p; 
        }
 
    }
 
    
return hash; 
}

 

測試結(jié)果

real    0m1.418s 
user    0m1.412s 
sys     0m0.004s

 

 

綜上,我的改進版本

#define likely(x) __builtin_expect((x),1) 
#define unlikely(x) __builtin_expect((x),0) 
    
//php版本 
    unsigned long time33(char const *str, int len=-1
    

        unsigned 
long hash = 5381
        
/* variant with the hash unrolled eight times */ 
        
char const *= str; 
        
if (unlikely(len<0)) 
                
for(; *p; p++
                    hash 
= hash * 33 + *p; 
                }
 
                
return hash; 
        }


#define TIME33_HASH_MIXED_CH()  hash = ((hash<<5)+hash) + *p++ 
        
for (; len >= 8; len -= 8
            TIME33_HASH_MIXED_CH(); 
//
            TIME33_HASH_MIXED_CH(); //
            TIME33_HASH_MIXED_CH(); //
            TIME33_HASH_MIXED_CH(); //
            TIME33_HASH_MIXED_CH(); //
            TIME33_HASH_MIXED_CH(); //
            TIME33_HASH_MIXED_CH(); //
            TIME33_HASH_MIXED_CH(); //
       }
 
       
switch (len) 
           
case 7: TIME33_HASH_MIXED_CH(); /* fallthrough */ 
           
case 6: TIME33_HASH_MIXED_CH(); /* fallthrough */ 
           
case 5: TIME33_HASH_MIXED_CH(); /* fallthrough */ 
           
case 4: TIME33_HASH_MIXED_CH(); /* fallthrough */ 
           
case 3: TIME33_HASH_MIXED_CH(); /* fallthrough */ 
           
case 2: TIME33_HASH_MIXED_CH(); /* fallthrough */ 
           
case 1: TIME33_HASH_MIXED_CH(); break
           
case 0break
       }
 
       
return hash; 
   }


#undef TIME33_HASH_MIXED_CH

 

測試結(jié)果

real    0m1.072s 
user    0m1.064s 
sys     0m0.000s

測試過, 重復(fù)率在 1/2000。

 

為什么是33的倍數(shù), PHP中注釋是

DJBX33A (Daniel J. Bernstein, Times 33 with Addition)
  This 
is Daniel J. Bernstein's popular `times 33' hash function as
  posted by him years ago on comp.lang.c. It basically uses a function
  like ``hash(i) 
= hash(i-1* 33 + str[i]''. This is one of the best
  known hash functions 
for strings. Because it is both computed very
  fast and distributes very well.
  The magic of number 
33, i.e. why it works better than many other
  constants, prime or not, has never been adequately explained by
  anyone. So I 
try an explanation: if one experimentally tests all
  multipliers between 
1 and 256 (as RSE did now) one detects that even
  numbers are not useable at all. The remaining 
128 odd numbers
  (except 
for the number 1) work more or less all equally well. They
  all distribute 
in an acceptable way and this way fill a hash table
  with an average percent of approx. 
86%.
  If one compares the Chi
^2 values of the variants, the number 33 not
  even has the best value. But the number 
33 and a few other equally
  good numbers like 
173163127 and 129 have nevertheless a great
  advantage to the remaining numbers 
in the large set of possible
  multipliers: their multiply operation can be replaced by a faster
  operation based on just one shift plus either a single addition
  or subtraction operation. And because a hash function has to both
  distribute good _and_ has to be very fast to compute, those few
  numbers should be preferred and seems to be the reason why Daniel J.
  Bernstein also preferred it.
                   
-- Ralf S. Engelschall rse@engelschall.com

 

 

其它倍數(shù)

Ngix使用的是 time31

Tokyo Cabinet使用的是 time37

Bob在他的文章說,小寫英文詞匯適合33, 大小寫混合使用65。time33比較適合的是英文詞匯的hash.


posted on 2011-07-26 15:07 楊粼波 閱讀(1940) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美三级网页| 日韩系列在线| 日韩视频一区二区在线观看| 好看不卡的中文字幕| 国产亚洲va综合人人澡精品| 国产欧美精品一区二区色综合 | 一区二区三区四区五区精品视频| 亚洲人成网站999久久久综合| 亚洲日本va在线观看| 亚洲精选中文字幕| 亚洲一区成人| 久久精品亚洲一区| 欧美第一黄色网| 一本色道久久综合亚洲精品不| 亚洲深夜福利在线| 久久免费高清视频| 欧美日韩亚洲一区三区| 国产精品一区二区三区久久久| 黄色成人在线| 在线亚洲高清视频| 久久综合狠狠综合久久综青草| 免费美女久久99| 在线一区观看| 噜噜噜91成人网| 国产精品草莓在线免费观看| 国产永久精品大片wwwapp| 91久久午夜| 久久激情五月丁香伊人| 亚洲欧洲视频| 先锋影音网一区二区| 欧美国产精品| 一区二区三区在线高清| 亚洲欧美清纯在线制服| 欧美激情小视频| 亚欧成人在线| 国产精品毛片在线看| 免费成人在线视频网站| 久久亚洲私人国产精品va| 亚洲福利在线观看| 欧美一级视频| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 一区二区欧美日韩视频| 久久久噜噜噜| 国产农村妇女精品一区二区| 一本久久综合亚洲鲁鲁五月天| 乱人伦精品视频在线观看| 亚洲免费影视| 国产精品一区免费在线观看| 一本不卡影院| 亚洲激情网站| 欧美电影资源| 亚洲精品乱码久久久久久黑人 | 亚洲日本欧美天堂| 欧美大片在线看| 久久午夜电影| 黄色精品免费| 免播放器亚洲一区| 久久久久在线观看| 在线播放日韩专区| 欧美mv日韩mv国产网站app| 久久av资源网站| 精品粉嫩aⅴ一区二区三区四区| 久久久精品性| 久久久水蜜桃| 亚洲欧洲日本mm| 亚洲精品国产拍免费91在线| 欧美v亚洲v综合ⅴ国产v| 亚洲国产裸拍裸体视频在线观看乱了中文| 久久亚洲精选| 欧美国产一区在线| 一本色道久久综合精品竹菊| 99ri日韩精品视频| 国产精品一级在线| 久久人人爽国产| 欧美成人精品h版在线观看| 亚洲乱码国产乱码精品精98午夜| 亚洲激情在线观看| 国产精品久久久99| 久久久久一区二区三区| 老司机成人网| 亚洲午夜av在线| 欧美一区午夜视频在线观看| 激情一区二区三区| 亚洲国产一区二区三区a毛片| 欧美日韩免费高清| 久久av资源网| 欧美电影打屁股sp| 欧美在线播放| 欧美暴力喷水在线| 在线性视频日韩欧美| 亚洲大胆在线| 亚洲黄色一区二区三区| 国产精品成人国产乱一区| 久久国产夜色精品鲁鲁99| 狂野欧美一区| 性高湖久久久久久久久| 久热国产精品| 亚洲欧美久久| 欧美mv日韩mv亚洲| 久久电影一区| 欧美日韩第一页| 美女成人午夜| 国产精品一区二区a| 亚洲韩国日本中文字幕| 国产亚洲亚洲| 亚洲精品视频免费| 亚洲第一精品久久忘忧草社区| 亚洲色图制服丝袜| 亚洲精品综合精品自拍| 亚洲欧美另类久久久精品2019| 亚洲国语精品自产拍在线观看| 亚洲一区二区高清视频| 日韩一级免费观看| 久久综合九色综合欧美狠狠| 欧美一区二区三区精品电影| 欧美国产第一页| 欧美福利一区| 亚洲大胆视频| 久久久午夜电影| 久久久久久久999| 国产精品啊啊啊| 亚洲精品网址在线观看| 亚洲精品国产精品国自产在线| 久久国产色av| 欧美一区二区三区免费大片| 国产精品久久国产三级国电话系列 | 亚洲国产美女精品久久久久∴| 亚洲午夜视频在线观看| 亚洲视频碰碰| 欧美日韩一区在线观看| 最新中文字幕亚洲| 亚洲久久一区二区| 欧美激情综合色综合啪啪| 亚洲电影免费观看高清| 亚洲国产一区二区a毛片| 久热re这里精品视频在线6| 久久九九99视频| 黑人操亚洲美女惩罚| 久久精品国产2020观看福利| 欧美一级成年大片在线观看| 国产精品久久久久久久久久免费看| 日韩亚洲欧美成人| 亚洲视频在线观看视频| 国产精品久久久对白| 亚洲一区在线看| 久久精品123| 在线观看欧美日韩国产| 欧美成人一区二免费视频软件| 亚洲电影下载| 亚洲无限av看| 国产精品系列在线| 久久精品成人| 亚洲高清不卡在线| 亚洲视频欧洲视频| 国产日韩欧美二区| 久久久久.com| 日韩一区二区福利| 亚洲免费在线视频| 狼狼综合久久久久综合网| 亚洲电影av| 欧美日韩一区二区三区在线看| 一区二区三区日韩精品| 久久精品视频免费| 亚洲人成在线观看网站高清| 欧美午夜激情小视频| 久久精品视频免费播放| 亚洲精品美女在线观看播放| 香蕉久久夜色精品国产| 在线国产亚洲欧美| 欧美性色综合| 久久人人爽人人| 一区二区三区四区精品| 久久人体大胆视频| 一本色道久久综合亚洲精品高清 | 亚洲承认在线| 亚洲在线不卡| 亚洲第一精品久久忘忧草社区| 欧美日韩一区二区精品| 欧美综合国产精品久久丁香| 亚洲高清在线视频| 久久精品91久久久久久再现| 日韩网站在线| 一区在线观看| 国产精品区一区二区三区| 欧美不卡福利| 欧美一级片在线播放| 一区二区三区 在线观看视| 免费久久99精品国产| 欧美伊人久久久久久久久影院| 日韩视频在线你懂得| 亚洲成人在线| 国产综合色产在线精品| 国产精品v日韩精品| 欧美大片在线观看| 久久久精品日韩| 欧美中文字幕在线| 亚洲欧美中日韩| 一区二区日韩精品| 亚洲久久在线| 亚洲精品国产视频|