亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

php的hash算法介紹

2024-05-04 23:21:12
字體:
來源:轉載
供稿:網友

Hash Table是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 -=  {
        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


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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
美女视频黄免费的亚洲男人天堂| 97在线免费视频| 久久综合伊人77777尤物| 91精品国产综合久久香蕉922| 亚洲另类激情图| 成人黄色大片在线免费观看| 久久久久久久久久国产精品| 成人网在线观看| 精品国产成人av| 国产欧洲精品视频| 久久免费视频网站| 亚洲欧美日韩国产中文专区| 亚洲第一视频在线观看| 日韩av电影在线网| 国产亚洲精品激情久久| 亚洲国产99精品国自产| 精品激情国产视频| 亚洲精品小视频在线观看| 日本一区二区三区在线播放| 麻豆国产精品va在线观看不卡| 日本免费一区二区三区视频观看| 亚洲石原莉奈一区二区在线观看| 日韩欧美在线一区| 久久福利视频导航| 97免费视频在线播放| 欧美日韩aaaa| 欧美亚洲激情视频| 亚洲精品福利免费在线观看| 欧美综合国产精品久久丁香| 国产精品aaa| 九九精品在线播放| 欧美性猛交丰臀xxxxx网站| 91精品久久久久久久久久久久久| 欧美大尺度在线观看| 韩国视频理论视频久久| 欧美日本黄视频| 欧美精品免费在线观看| 亚洲一区美女视频在线观看免费| 国产一区二区三区免费视频| 欧美怡红院视频一区二区三区| 精品国产91乱高清在线观看| 亚洲精品自拍第一页| 国产精品一区二区久久久久| 成人国产精品久久久久久亚洲| 一个人看的www久久| 亚洲精品久久久久中文字幕二区| 亚洲最新中文字幕| 欧美巨猛xxxx猛交黑人97人| 欧美黄色成人网| 成人精品网站在线观看| 亚洲欧美另类中文字幕| 国产精品电影一区| 亚洲成人aaa| 亚洲精品日韩久久久| 久久久久久国产精品久久| 欧美一级淫片videoshd| 亚洲第一网站免费视频| 欧洲精品毛片网站| 国产日本欧美在线观看| 91精品在线观| 69av成年福利视频| 久久亚洲精品国产亚洲老地址| 国产精品欧美激情在线播放| 在线观看欧美日韩国产| 欧美日本中文字幕| 亚洲日本成人女熟在线观看| 亚洲天堂影视av| 国产精品一二区| 国产精品视频999| 91美女片黄在线观看游戏| 一本色道久久88综合日韩精品| 欧美成人性色生活仑片| 久久频这里精品99香蕉| 国产亚洲欧美日韩一区二区| 日韩欧美国产中文字幕| 日韩欧美精品免费在线| 色妞久久福利网| 亚洲一区国产精品| 国内精品久久久久久影视8| 全球成人中文在线| 日韩在线视频中文字幕| 国产亚洲成精品久久| 亚洲国内精品视频| 亚洲 日韩 国产第一| 亚州欧美日韩中文视频| 亚洲最大成人网色| 91手机视频在线观看| 欧美激情一二区| 日韩欧美黄色动漫| 久久国产精品网站| 国产日韩精品入口| 中文字幕最新精品| 亚洲精品福利在线观看| 久久久亚洲国产天美传媒修理工| 亚洲午夜av电影| 亚洲精品国产品国语在线| 亚洲精品aⅴ中文字幕乱码| 91精品美女在线| 欧美理论电影网| 91精品国产自产91精品| 亚洲自拍小视频免费观看| 亚洲韩国青草视频| 色综合老司机第九色激情| 国产精品免费一区二区三区都可以| 伊人久久大香线蕉av一区二区| 欧美日韩中文字幕日韩欧美| 中文字幕亚洲一区| 日韩成人小视频| 国产精品国产三级国产专播精品人| 欧美在线视频免费观看| 国产日韩欧美在线观看| 日韩在线观看免费网站| 日韩精品中文字幕视频在线| 亚洲国产三级网| 欧美日韩中文在线观看| 久久久免费观看| 国产精品久久久| 精品国产91乱高清在线观看| 91精品中国老女人| 亚洲欧美日本另类| 中文字幕久久久| 26uuu日韩精品一区二区| 国产这里只有精品| 色偷偷偷综合中文字幕;dd| 国产精品久久激情| 欧美日韩成人精品| 成人a级免费视频| 97香蕉超级碰碰久久免费的优势| 日韩网站免费观看高清| 亚洲老板91色精品久久| 欧美精品久久久久| 久久久久久这里只有精品| 欧美成人精品在线| 欧美电影免费播放| 欧美午夜精品在线| 欧美一区二区三区艳史| 最新69国产成人精品视频免费| 成人性生交大片免费观看嘿嘿视频| 久久久欧美一区二区| 91久久久国产精品| 欧美精品少妇videofree| 久久久精品国产网站| 色悠久久久久综合先锋影音下载| 久久久精品在线观看| 成人观看高清在线观看免费| 中文字幕精品网| 欧美极品少妇全裸体| 精品福利视频导航| 亚洲人成伊人成综合网久久久| 国产亚洲xxx| 美女999久久久精品视频| 欧美午夜精品伦理| 国产成人a亚洲精品| 久久久www成人免费精品张筱雨| 成人激情av在线| 欧美日韩国产影院| 国产剧情久久久久久| 亚洲成色777777女色窝| 91高潮在线观看| 亚洲国产高清自拍| 伊人激情综合网| 国产视频综合在线| 国产z一区二区三区| 日本sm极度另类视频|