欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php-perl哈希算法實現(xiàn)(times33哈希算法)

 更新時間:2013年12月30日 14:32:54   作者:  
php-perl哈希實現(xiàn)算法–DJBX33A(Daniel J. Bernstein, Times 33 with Addition)APR哈希默認算法

復制代碼 代碼如下:

APR_DECLARE_NONSTD(unsigned int) apr_hashfunc_default(const char *char_key,
                                                      apr_ssize_t *klen)
{
    unsigned int hash = 0;
    const unsigned char *key = (const unsigned char *)char_key;
    const unsigned char *p;
    apr_ssize_t i;

    /*
     * This is the popular `times 33' hash algorithm which is used by
     * perl and also appears in Berkeley DB. This is one of the best
     * known hash functions for strings because it is both computed
     * very fast and distributes very well.
     *
     * The originator may be Dan Bernstein but the code in Berkeley DB
     * cites Chris Torek as the source. The best citation I have found
     * is "Chris Torek, Hash function for text in C, Usenet message
     * <27038@mimsy.umd.edu> in comp.lang.c , October, 1990." in Rich
     * Salz's USENIX 1992 paper about INN which can be found at
     * .
     *
     * 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 I did while writing a low-level
     * data structure library some time ago) 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 (see
     * Bob Jenkins ``Hashing Frequently Asked Questions'' at
     * http://burtleburtle.net/bob/hash/hashfaq.html for a description
     * of chi^2), the number 33 not even has the best value. But the
     * number 33 and a few other equally good numbers like 17, 31, 63,
     * 127 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.
     *
     *                  -- Ralf S. Engelschall
     */

    if (*klen == APR_HASH_KEY_STRING) {
        for (p = key; *p; p++) {
            hash = hash * 33 + *p;
        }
        *klen = p - key;
    }
    else {
        for (p = key, i = *klen; i; i--, p++) {
            hash = hash * 33 + *p;
        }
    }
    return hash;
}

對函數(shù)注釋部分的翻譯: 這是很出名的times33哈希算法,此算法被perl語言采用并在Berkeley DB中出現(xiàn).它是已知的最好的哈希算法之一,在處理以字符串為鍵值的哈希時,有著極快的計算效率和很好哈希分布.最早提出這個算法的是Dan Bernstein,但是源代碼確實由Clris Torek在Berkeley DB出實作的.我找到的最確切的引文中這樣說”Chris Torek,C語言文本哈希函數(shù),Usenet消息<<27038@mimsy.umd.edu> in comp.lang.c ,1990年十月.”在Rich Salz于1992年在USENIX報上發(fā)表的討論INN的文章中提到.這篇文章可以在上找到. 33這個奇妙的數(shù)字,為什么它能夠比其他數(shù)值效果更好呢?無論重要與否,卻從來沒有人能夠充分說明其中的原因.因此在這里,我來試著解釋一下.如果某人試著測試1到256之間的每個數(shù)字(就像我前段時間寫的一個底層數(shù)據(jù)結構庫那樣),他會發(fā)現(xiàn),沒有哪一個數(shù)字的表現(xiàn)是特別突出的.其中的128個奇數(shù)(1除外)的表現(xiàn)都差不多,都能夠達到一個能接受的哈希分布,平均分布率大概是86%. 如果比較這128個奇數(shù)中的方差值(gibbon:統(tǒng)計術語,表示隨機變量與它的數(shù)學期望之間的平均偏離程度)的話(見Bob Jenkins的<哈希常見疑問>http://burtleburtle.net/bob/hash/hashfaq.html,中對平方差的描述),數(shù)字33并不是表現(xiàn)最好的一個.(gibbon:這里按照我的理解,照常理,應該是方差越小穩(wěn)定,但是由于這里不清楚作者方差的計算公式,以及在哈希離散表,是不是離散度越大越好,所以不得而知這里的表現(xiàn)好是指方差值大還是指方差值小),但是數(shù)字33以及其他一些同樣好的數(shù)字比如 17,31,63,127和129對于其他剩下的數(shù)字,在面對大量的哈希運算時,仍然有一個大大的優(yōu)勢,就是這些數(shù)字能夠將乘法用位運算配合加減法來替換,這樣的運算速度會提高.畢竟一個好的哈希算法要求既有好的分布,也要有高的計算速度,能同時達到這兩點的數(shù)字很少.

相關文章

  • php中trim函數(shù)實例用法

    php中trim函數(shù)實例用法

    在本篇文章里小編給大家整理的是一篇關于php中trim函數(shù)實例用法內容,有興趣的朋友們可以學習下。
    2021-01-01
  • php批量刪除超鏈接的實現(xiàn)方法

    php批量刪除超鏈接的實現(xiàn)方法

    有時候我們會遇到這種需求,清除掉一段html文本內容中的超鏈接,這時有什么好辦法呢?下面就總結幾種簡單的方法清除html文本中的超鏈接,需要的朋友可以參考下
    2015-10-10
  • 通過table標簽,PHP輸出EXCEL的實現(xiàn)方法

    通過table標簽,PHP輸出EXCEL的實現(xiàn)方法

    以下是利用table標簽,對PHP輸出EXCEL的實現(xiàn)代碼進行了介紹,需要的朋友可以過來參考下
    2013-07-07
  • php使用cookie保存登錄用戶名的方法

    php使用cookie保存登錄用戶名的方法

    這篇文章主要介紹了php使用cookie保存登錄用戶名的方法,包括提交頁面及設置cookie的方法,需要的朋友可以參考下
    2015-01-01
  • PHP中生成UUID自定義函數(shù)分享

    PHP中生成UUID自定義函數(shù)分享

    這篇文章主要介紹了PHP中生成UUID自定義函數(shù)分享,本文提供的代碼可以生成一個 UUID version 4,,需要的朋友可以參考下
    2015-06-06
  • 標準PHP的AES加密算法類

    標準PHP的AES加密算法類

    AES是分組密鑰,算法輸入128位數(shù)據(jù),密鑰長度也是128位。用Nr表示對一個數(shù)據(jù)分組加密的輪數(shù)(加密輪數(shù)與密鑰長度的關系如表1所列)。每一輪都需要一個與輸入分組具有相同長度的擴展密鑰Expandedkey(i)的參與。
    2015-03-03
  • php include加載文件兩種方式效率比較

    php include加載文件兩種方式效率比較

    這兩天抽了點時間繼續(xù)完善“X計劃”的核心部分,核心嘛,就要加載必須的文件,嘗試了兩種方法,發(fā)現(xiàn)效率是不同的,分享一下吧~
    2010-08-08
  • PHP解析RSS的方法

    PHP解析RSS的方法

    這篇文章主要介紹了PHP解析RSS的方法,實例分析了php解析RSS的原理與XML文件的操作技巧,需要的朋友可以參考下
    2015-03-03
  • php使用pack處理二進制文件的方法

    php使用pack處理二進制文件的方法

    這篇文章主要介紹了php使用pack處理二進制文件的方法,需要的朋友可以參考下
    2014-07-07
  • php設計模式 Bridge (橋接模式)

    php設計模式 Bridge (橋接模式)

    將抽象部份與它實現(xiàn)部分分離,使用它們都可以有獨立的變化
    2011-06-06

最新評論