日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP內核探索 —— PHP哈希算法設計

瀏覽:27日期:2022-09-16 14:16:29

HashTable是PHP的核心,這話一點都不過分。PHP的數組、關聯數組、對象屬性、函數表、符號表等等都是用HashTable來做為容器的。

PHP的HashTable采用的拉鏈法來解決沖突,這個自不用多說,我今天主要關注的就是PHP的Hash算法,和這個算法本身透露出來的一些思想。

PHP的Hash采用的是目前最為普遍的DJBX33A (Daniel J. Bernstein, Times 33 with Addition),這個算法被廣泛運用與多個軟件項目,Apache、Perl和Berkeley DB等。對于字符串而言這是目前所知道的最好的哈希算法,原因在于該算法的速度非常快,而且分類非常好(沖突小,分布均勻)。

算法的核心思想就是:

hash(i) = hash(i-1) * 33 + str[i]

在zend_hash.h中,我們可以找到在PHP中的這個算法:

static inline ulong zend_inline_hash_func(char *arKey, uint nKeyLength){ register ulong hash = 5381; /* variant with the hash unrolled eight times */for (; nKeyLength >= 8; nKeyLength -= 8) {hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++; } switch (nKeyLength) {case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 1: hash = ((hash << 5) + hash) + *arKey++; break;case 0: break;EMPTY_SWITCH_DEFAULT_CASE() } return hash;}

相比在Apache和Perl中直接采用的經典Times 33算法:

hashing function used in Perl 5.005:# Return the hashed value of a string: $hash = perlhash('key')# (Defined by the PERL_HASH macro in hv.h)sub perlhash{ $hash = 0; foreach (split //, shift) {$hash = $hash*33 + ord($_); } return $hash;}

在PHP的hash算法中,我們可以看出很處細致的不同。首先,最不一樣的就是,PHP中并沒有使用直接乘33,而是采用了:

hash << 5 + hash

這樣當然會比用乘快了。

然后,特別要主意的就是使用的unrolled,我前幾天看過一篇文章講Discuz的緩存機制,其中就有一條說是Discuz會根據帖子的熱度不同采用不同的緩存策略,根據用戶習慣,而只緩存帖子的第一頁(因為很少有人會翻帖子)。

于此類似的思想,PHP鼓勵8位一下的字符索引,他以8為單位使用unrolled來提高效率,這不得不說也是個很細節的,很細致的地方。

另外還有inline,register變量 … 可以看出PHP的開發者在hash的優化上也是煞費苦心。

最后就是,hash的初始值設置成了5381,相比在Apache中的times算法和Perl中的Hash算法(都采用初始hash為0),為什么選5381呢?具體的原因我也不知道,但是我發現了5381的一些特性:

Magic Constant 5381: 1. odd number 2. prime number 3. deficient number 4. 001/010/100/000/101 b

看了這些,我有理由相信這個初始值的選定能提供更好的分類。

至于說,為什么是Times 33而不是Times 其他數字,在PHP Hash算法的注釋中也有一些說明,希望對有興趣的同學有用:

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

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品免费观看视频| 国产美女亚洲精品7777| 欧美粗暴jizz性欧美20| 99精品99| 欧美一区91| 成午夜精品一区二区三区软件| 久久网站免费观看| 日韩成人精品一区二区三区| 韩日一区二区| 国产亚洲一区在线| 国产精品2区| 国产99久久| 欧美专区一区| 国内精品美女在线观看| 黄色亚洲免费| 国产极品一区| 亚洲激情中文| 国产精品一区二区av日韩在线| 久久免费国产| 国产亚洲一区二区三区不卡| 久久婷婷久久| 91麻豆精品激情在线观看最新| 黑人精品一区| 亚洲精品影院在线观看| 亚洲精品永久免费视频| 日本va欧美va瓶| 日韩精品一区二区三区免费观影| 日本不卡中文字幕| аⅴ资源天堂资源库在线| 日韩中文字幕91| 国产传媒在线观看| 日韩高清欧美激情| 国产一区欧美| 精品视频高潮| 蜜臀av性久久久久蜜臀aⅴ四虎| 精品一区二区三区免费看| 人人爽香蕉精品| 日韩欧美精品一区| 日韩av网站免费在线| 99成人超碰| 精品中文字幕一区二区三区四区| 中文字幕亚洲影视| 91精品xxx在线观看| 日本不卡视频在线| 蜜桃一区二区三区| 精品国产成人| 青青草91久久久久久久久| 亚洲激情五月| 日韩精品诱惑一区?区三区| 国产欧美成人| 免费人成黄页网站在线一区二区| 性欧美videohd高精| 国产极品一区| 日韩av不卡在线观看| 免费欧美日韩| 免费观看久久av| 黄在线观看免费网站ktv| 国产精品久久久久9999高清| 亚洲午夜免费| 日韩一级欧洲| 欧美日韩一二三四| 欧美成人a交片免费看| 欧美国产中文高清| 国产一精品一av一免费爽爽| 亚洲开心激情| 巨乳诱惑日韩免费av| 欧美久久精品一级c片| 日韩高清成人| 日本а中文在线天堂| 精品一区二区三区中文字幕在线| 日本强好片久久久久久aaa| 视频一区二区三区入口| 国产亚洲精品v| 国产精品88久久久久久| 伊人久久高清| 亚洲精品一级二级| 一区二区三区四区日本视频| 国产成人免费精品| 精品中文字幕一区二区三区四区| 国产精品一区二区av日韩在线| 日韩精品欧美大片| 综合激情网站| 日韩毛片网站| 国产日韩欧美一区| 国产精品二区影院| 麻豆精品视频在线| 麻豆视频观看网址久久| 久久中文字幕一区二区三区| 欧美视频精品全部免费观看| 中文字幕乱码亚洲无线精品一区| 美女久久一区| 一区二区三区午夜视频| 亚洲我射av| 色综合视频一区二区三区日韩 | 久久av免费看| 五月天av在线| 久久成人福利| 免费在线观看不卡| 不卡在线一区二区| 国产精品毛片久久久| 影音先锋久久| 日韩另类视频| 国产成人久久精品一区二区三区| 国产日韩一区二区三区在线| 婷婷精品久久久久久久久久不卡| 视频一区在线视频| 免费精品视频| 免费精品视频| 久久亚洲影院| 免费人成黄页网站在线一区二区| 欧美精选一区二区三区| 久久久国产精品一区二区中文| 精品网站999| 精品免费av| 久久影院一区二区三区| 欧美黄色精品| 久久精品国产成人一区二区三区| 久久不见久久见国语| 久久中文在线| 在线人成日本视频| 日韩欧美自拍| 1024精品一区二区三区| 亚洲精品网址| 日韩在线卡一卡二| 亚洲精品国产日韩| 日韩avvvv在线播放| 国产欧美一区二区三区精品观看 | 国产亚洲精品美女久久| 91成人小视频| 国产日韩欧美一区| 国产精品v日韩精品v欧美精品网站 | 日韩精品乱码av一区二区| 亚洲一区二区三区四区电影| 美美哒免费高清在线观看视频一区二区| 国产亚洲福利| 最近国产精品视频| 欧美在线91| 麻豆国产91在线播放| av资源中文在线天堂| 欧美.日韩.国产.一区.二区 | 日韩精品午夜视频| 国产福利资源一区| 久久久9色精品国产一区二区三区| 成人欧美一区二区三区的电影| 国产一区二区三区四区五区 | 超碰99在线| 日韩一级欧洲| 国产精品一区毛片| 一本一本久久| 精品久久一区| 国产精品美女| 亚洲一级少妇| 日本不卡视频在线| 欧美jjzz| 久久麻豆精品| 免费在线观看一区| 国产精品地址| 在线视频免费在线观看一区二区| 免费污视频在线一区| 国产精品一区二区美女视频免费看| 免费国产自久久久久三四区久久 | 亚洲在线电影| 蜜桃久久久久| 国产精品www994| 成人三级高清视频在线看| 日韩午夜精品| 国产乱人伦丫前精品视频| www.com.cn成人| 视频一区视频二区中文| 久久国产精品免费一区二区三区| 日韩欧美视频专区| 综合激情视频| 国产精品免费看| 美女视频一区在线观看| 在线观看视频免费一区二区三区| 啪啪亚洲精品| 久久av偷拍| 欧美二区视频| 久久一区二区三区电影| 狠狠干综合网| 亚洲精品极品| 国语精品一区| 99re国产精品| 国产精品嫩模av在线| 精品国产91| 麻豆精品网站| 精品国产一区二区三区噜噜噜| 精品中国亚洲| 在线亚洲自拍| 成人污污视频| 日韩中文字幕一区二区三区| 国产精品欧美大片| 日韩午夜一区| 91视频久久| 一本一道久久a久久| 日韩一区二区三区高清在线观看| 国产欧美自拍| 国产毛片久久久| 国产精品久久久久久模特| 日韩伦理福利|