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

牽著老婆滿(mǎn)街逛

嚴(yán)以律己,寬以待人. 三思而后行.
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哈希.

最簡(jiǎn)單的版本

  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; 
    }

 

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

 

把乘法操作換成位操作

        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個(gè)字符1000 0000次運(yùn)行(gcc沒(méi)有開(kāi)啟優(yōu)化,因?yàn)殚_(kāi)了優(yōu)化后兩個(gè)函數(shù)的實(shí)際代碼會(huì)一樣)

第一個(gè):

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

 

第二個(gè):

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個(gè)字符,1000 0000次

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

 

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

php版本的hash初始值是5381, 這個(gè)

 

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; 
}

 

測(cè)試結(jié)果

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

 

 

綜上,我的改進(jìn)版本

#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

 

測(cè)試結(jié)果

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

測(cè)試過(guò), 重復(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在他的文章說(shuō),小寫(xiě)英文詞匯適合33, 大小寫(xiě)混合使用65。time33比較適合的是英文詞匯的hash.


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


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            中文国产成人精品| 一区二区三区四区国产| 欧美怡红院视频| 精久久久久久久久久久| 老色鬼久久亚洲一区二区| 久久亚洲精品欧美| 在线精品视频一区二区| 亚洲国产欧美精品| 欧美在线一区二区| 久久久国产精品一区二区中文| 国语精品一区| 亚洲激情影视| 欧美视频中文在线看| 欧美一级午夜免费电影| 久久av一区二区三区漫画| 亚洲国产一区在线| 亚洲视频www| 亚洲成在人线av| 一区二区三区回区在观看免费视频| 国产一区二区精品丝袜| 欧美大片在线观看一区| 欧美视频在线视频| 麻豆免费精品视频| 欧美日韩国产三级| 久久免费视频网| 欧美日韩视频第一区| 久热精品视频在线| 国产精品久久久久久久久久ktv| 巨胸喷奶水www久久久免费动漫| 欧美人与禽性xxxxx杂性| 久久精品视频一| 欧美日一区二区在线观看 | 91久久午夜| 亚洲伊人第一页| 夜夜狂射影院欧美极品| 久久久国产亚洲精品| 亚洲欧美福利一区二区| 欧美www视频| 狂野欧美激情性xxxx| 国产精品免费一区二区三区在线观看| 欧美激情亚洲一区| 激情91久久| 欧美诱惑福利视频| 午夜精品婷婷| 欧美色网一区二区| 亚洲精品日本| 99成人免费视频| 欧美国产精品日韩| 欧美高清不卡在线| 精品成人久久| 久久精品主播| 久久久久久夜| 韩日欧美一区| 久久动漫亚洲| 久久野战av| 国产一区久久| 欧美在线视屏| 久久亚洲免费| 伊人夜夜躁av伊人久久| 久久国产精品网站| 久久久久久久久久久久久女国产乱 | 亚洲欧美激情视频在线观看一区二区三区 | 久久综合九色综合久99| 韩国成人精品a∨在线观看| 午夜激情久久久| 久久久国产精品一区二区中文| 国产午夜精品久久| 久久精品国产亚洲a| 久久免费视频观看| **性色生活片久久毛片| 老司机精品久久| 亚洲国产欧美日韩精品| 99精品欧美一区二区蜜桃免费| 欧美精品一线| 亚洲手机视频| 久久久精品午夜少妇| 在线观看欧美一区| 欧美激情精品久久久久久| 亚洲免费大片| 欧美在线观看你懂的| 在线播放一区| 欧美日韩三区| 欧美在线电影| 亚洲成在线观看| 亚洲一区二区三区精品在线观看| 国产精品卡一卡二| 久久精品视频在线看| 亚洲国产成人精品视频 | 国产日韩在线视频| 老色鬼精品视频在线观看播放| 亚洲精品国产欧美| 欧美一区二区三区在线视频| 在线看片日韩| 欧美系列亚洲系列| 久久久久国产精品一区三寸| 亚洲国产视频a| 欧美一区二区三区日韩视频| 亚洲激情综合| 国产精品视频一二| 美女国内精品自产拍在线播放| 一本一本久久a久久精品牛牛影视| 欧美与黑人午夜性猛交久久久| 亚洲国产日韩欧美在线99 | 国产欧美日本一区二区三区| 免费欧美视频| 欧美一区二区成人6969| 最近中文字幕日韩精品| 久久久欧美一区二区| 一区二区欧美在线观看| 红桃视频欧美| 国产精品一区视频| 欧美日韩免费区域视频在线观看| 久久久久国产一区二区三区| 在线一区免费观看| 亚洲国产精品毛片| 毛片一区二区| 久久精品国产久精国产思思| 亚洲一区二区欧美日韩| 亚洲精选久久| 亚洲第一二三四五区| 国产精品自在在线| 欧美午夜精品久久久| 欧美激情导航| 欧美xart系列高清| 久久在线视频| 久久久久亚洲综合| 久久gogo国模啪啪人体图| 亚洲网址在线| 亚洲手机在线| 亚洲先锋成人| 亚洲一区二区三区中文字幕| 夜夜嗨一区二区| 一本不卡影院| 一区二区三区四区五区在线| 99精品视频一区| 99riav久久精品riav| 日韩视频国产视频| 99国产精品私拍| 99精品热6080yy久久| 99riav久久精品riav| 99精品福利视频| 中文在线资源观看网站视频免费不卡| 日韩视频欧美视频| 9i看片成人免费高清| 一区二区冒白浆视频| 亚洲午夜av在线| 欧美一区二区三区另类| 久久精品理论片| 久久久亚洲影院你懂的| 久久久久综合一区二区三区| 久久在线观看视频| 欧美不卡视频一区发布| 欧美精品久久99| 国产精品免费看| 国精品一区二区| 一区在线播放| 亚洲精品综合久久中文字幕| 国产精品99久久久久久白浆小说| 亚洲中字黄色| 久久尤物视频| 91久久中文字幕| 亚洲影视九九影院在线观看| 久久精品国产视频| 欧美丰满高潮xxxx喷水动漫| 欧美视频精品在线| 国产亚洲欧美日韩精品| 亚洲激情网址| 午夜在线视频观看日韩17c| 久久久久久综合网天天| 亚洲国产成人tv| 亚洲欧美韩国| 欧美xxx成人| 国产精品久久久久久久久久免费看 | 国产精品对白刺激久久久| 国产日韩欧美在线视频观看| 亚洲国产成人精品女人久久久| 一区二区三区日韩精品视频| 久久精品国产96久久久香蕉| 亚洲国产经典视频| 亚洲综合另类| 欧美绝品在线观看成人午夜影视| 国产精品三上| 亚洲精品国产精品国自产在线 | 欧美亚洲日本一区| 欧美精品日韩一本| 在线看欧美视频| 欧美一区中文字幕| 亚洲精品在线观看免费| 久久久国产亚洲精品| 国产精品久久久久久模特 | 亚洲黄色在线| 久久亚洲综合色| 午夜伦欧美伦电影理论片| 欧美精品久久久久久久久老牛影院| 国产亚洲电影| 亚洲一区高清| 日韩亚洲国产欧美| 奶水喷射视频一区| 一区视频在线| 久久中文字幕一区二区三区|