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

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

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

瀏覽:29日期: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久久,三上悠亚国产精品一区二区三区
成人污污视频| 国产亚洲欧美日韩精品一区二区三区| 亚洲91网站| 青青草91久久久久久久久| 精品国产第一福利网站| 一区二区电影| 亚洲毛片一区| 国产精品久久久久久av公交车| 欧美日韩国产免费观看| 伊人精品久久| 老鸭窝一区二区久久精品| 精品国产欧美日韩| 欧美日韩国产免费观看| 国产欧美日韩精品一区二区三区| 九九九精品视频| 伊人成人在线视频| 欧美精品观看| 91精品啪在线观看国产18| 亚洲毛片在线免费| 日韩欧美一区二区三区在线视频| aa国产精品| 成人午夜网址| 亚洲最大av| 国产一区国产二区国产三区| 伊人久久大香线蕉av不卡| 国产日产一区| 精品一区在线| 国产欧美日韩视频在线| 影音国产精品| 国产成年精品| 模特精品在线| 久久久国产精品一区二区中文| 欧美日一区二区在线观看| 欧美成人日韩| 久久uomeier| 911亚洲精品| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩av专区| 日韩精品电影一区亚洲| 激情综合激情| av日韩中文| 精品中文在线| 日韩成人在线看| 综合一区av| 国产日韩综合| 午夜精品久久久久久久久久蜜桃| 国产一区日韩| 羞羞答答国产精品www一本| 色一区二区三区| 精品视频国产| 国产精品videossex久久发布| 蜜臀久久99精品久久久久久9| 久久久久99| 国产精品亚洲产品| 亚洲a成人v| 日本伊人久久| 日本电影久久久| 亚洲人成网77777色在线播放| 99久久99久久精品国产片果冰| av不卡免费看| 91精品99| 亚洲美洲欧洲综合国产一区| 国产91在线精品| 国产精品中文字幕亚洲欧美| 性一交一乱一区二区洋洋av| 99日韩精品| 一区二区高清| 国产图片一区| 国产毛片精品久久| 麻豆一区二区99久久久久| 麻豆高清免费国产一区| 丰满少妇一区| 99久久精品网| 中文无码日韩欧| 黄色在线观看www| 日本亚洲不卡| 欧美精品国产| 亚洲www啪成人一区二区| 99国产一区| 久久狠狠久久| 日韩黄色大片网站| 影音先锋国产精品| 欧美日本二区| 国产成人黄色| 午夜在线精品偷拍| 欧美日韩一区二区三区不卡视频 | 免费成人性网站| 久久精品国产亚洲aⅴ| 欧美日韩在线网站| 国产情侣久久| 欧美午夜不卡影院在线观看完整版免费| 久久亚洲国产精品一区二区| 亚洲精品第一| 亚洲福利久久| 国产一区二区三区亚洲综合| 日韩视频免费| 精品视频一区二区三区四区五区| 合欧美一区二区三区| 麻豆精品国产91久久久久久| 黑丝一区二区| 在线看片国产福利你懂的| 亚洲久久视频| 99精品99| 好看的亚洲午夜视频在线| 精品伊人久久| 亚洲精品黄色| 首页亚洲欧美制服丝腿| 免费高潮视频95在线观看网站| 国产亚洲电影| 青青国产精品| 日本不卡不码高清免费观看| 亚洲欧美一区在线| 欧美一区免费| 日韩精品视频中文字幕| 精品欧美日韩精品| 久久国产人妖系列| 亚洲精品视频一二三区| 先锋影音久久久| 亚洲一级在线| 国产精品美女久久久| 亚洲一级黄色| 日韩午夜黄色| 国产农村妇女精品一二区| 亚洲激情二区| 羞羞答答国产精品www一本| 国产精品三上| 国产91欧美| 88xx成人免费观看视频库| 青青久久av| 在线国产一区| 亚洲欧美日韩一区在线观看| 亚洲欧美日韩国产一区二区| 亚洲免费中文| 91精品啪在线观看国产爱臀| 国产极品久久久久久久久波多结野 | av一区二区高清| 一区在线视频观看| 日韩美女国产精品| 欧美午夜网站| 都市激情国产精品| 国产亚洲午夜| 欧美1区2区3| 999久久久免费精品国产| 在线日韩欧美| 欧美在线黄色| 精品免费av在线| 日韩国产高清在线| 九九久久国产| 国产精品呻吟| 久久精品二区亚洲w码 | 久久99精品久久久野外观看| 麻豆一区二区在线| 欧美日韩精品一区二区视频| 在线免费观看亚洲| 国产h片在线观看| 亚洲三级毛片| 久久精品动漫| 国产精品宾馆| 日韩影院免费视频| 在线看片国产福利你懂的| 日韩av一区二区三区四区| 久久亚洲专区| 麻豆久久久久久| 蜜桃久久久久久久| 日韩久久一区二区三区| 欧美亚洲三区| 国产视频一区欧美| 国产精品13p| 国产探花一区二区| 乱人伦精品视频在线观看| 日本免费久久| 精品日韩一区| 97久久超碰| 亚洲视频二区| 久久成人精品| 在线日韩视频| 免费不卡中文字幕在线| 欧美国产小视频| 国产福利一区二区精品秒拍| 亚洲毛片视频| 天堂va在线高清一区| 视频一区二区国产| 婷婷激情综合| 狠狠色狠狠色综合日日tαg| 91av亚洲| 91成人超碰| 宅男噜噜噜66国产日韩在线观看| 亚洲日本网址| 极品日韩av| 噜噜噜躁狠狠躁狠狠精品视频 | 国产日韩欧美一区在线| 日本综合视频| 亚洲欧美在线专区| 亚洲综合国产| 在线一区二区三区视频| 午夜在线播放视频欧美| 亚洲免费毛片| 精品久久一区| 99免费精品| 亚洲欧美久久|