国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

瀏覽:6日期: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 <[email protected]>

標簽: PHP
相關文章:
主站蜘蛛池模板: 免费看男女做好爽好硬视频 | 国产波多野结衣中文在线播放 | 国产成人精品自拍 | 久草天堂| 国产亚洲欧美一区二区三区 | 欧美一级看片免费观看视频在线 | 日韩在线视频观看 | 美女毛片儿 | 亚洲精品国产精品国自产 | 男女午夜视频在线观看 | 色综久久 | 在线国产三级 | 99在线精品视频免费观里 | 欧美成年人视频 | 中文字幕一区二区在线视频 | 中文字幕日韩一区二区不卡 | 色www永久免费| 欧美高清在线精品一区二区不卡 | 欧美九九视频 | 一级特黄特色的免费大片视频 | 亚洲欧美视频一区二区 | 在线欧美日韩精品一区二区 | 在线中文字幕一区 | 国产手机在线小视频免费观看 | 午夜宅宅宅影院在线观看 | 成人欧美一区二区三区在线 | 亚洲高清视频免费 | 爽死你个放荡粗暴小淫货双女视频 | 中文字幕一区中文亚洲 | 免费一级毛片无毒不卡 | 亚洲社区在线观看 | 一级成人毛片免费观看欧美 | 亚洲 自拍 另类 欧美 综合 | 久爱午夜精品免费视频 | 亚洲精品国产高清不卡在线 | 国产永久免费高清动作片www | 国产欧美网站 | 欧美一级特黄真人毛片 | 国产在线视频网址 | 自拍自录videosfree自拍自录 | 在线观看自拍视频 |