• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            【什么是Hash】

            Hash,一般翻譯做“散列”,也有直接音譯為“哈希”的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。

            HASH主要用于信息安全領域中加密算法,它把一些不同長度的信息轉化成雜亂的128位的編碼,這些編碼值叫做HASH值. 也可以說,hash就是找到一種數據內容和數據存放地址之間的映射關系。

            數組的特點是:尋址容易,插入和刪除困難;而鏈表的特點是:尋址困難,插入和刪除容易。那么我們能不能綜合兩者的特性,做出一種尋址容易,插入刪除也容易的數據結構?答案是肯定的,這就是我們要提起的哈希表,哈希表有多種不同的實現方法,我接下來解釋的是最常用的一種方法——拉鏈法,我們可以理解為“鏈表的數組”,如圖:

            左邊很明顯是個數組,數組的每個成員包括一個指針,指向一個鏈表的頭,當然這個鏈表可能為空,也可能元素很多。我們根據元素的一些特征把元素分配到不同的鏈表中去,也是根據這些特征,找到正確的鏈表,再從鏈表中找出這個元素。

            元素特征轉變為數組下標的方法就是散列法。散列法當然不止一種,下面列出三種比較常用的。

            1,除法散列法
            最直觀的一種,上圖使用的就是這種散列法,公式:
            index = value % 16
            學過匯編的都知道,求模數其實是通過一個除法運算得到的,所以叫“除法散列法”。

            2,平方散列法
            求index是非常頻繁的操作,而乘法的運算要比除法來得省時(對現在的CPU來說,估計我們感覺不出來),所以我們考慮把除法換成乘法和一個位移操作。公式:
            index = (value * value) >> 28
            如果數值分配比較均勻的話這種方法能得到不錯的結果,但我上面畫的那個圖的各個元素的值算出來的index都是0——非常失敗。也許你還有個問題,value如果很大,value * value不會溢出嗎?答案是會的,但我們這個乘法不關心溢出,因為我們根本不是為了獲取相乘結果,而是為了獲取index。

            3,斐波那契(Fibonacci)散列法

            平方散列法的缺點是顯而易見的,所以我們能不能找出一個理想的乘數,而不是拿value本身當作乘數呢?答案是肯定的。

            1,對于16位整數而言,這個乘數是40503
            2,對于32位整數而言,這個乘數是2654435769
            3,對于64位整數而言,這個乘數是11400714819323198485

            這幾個“理想乘數”是如何得出來的呢?這跟一個法則有關,叫黃金分割法則,而描述黃金分割法則的最經典表達式無疑就是著名的斐波那契數列,如果你還有興趣,就到網上查找一下“斐波那契數列”等關鍵字,我數學水平有限,不知道怎么描述清楚為什么,另外斐波那契數列的值居然和太陽系八大行星的軌道半徑的比例出奇吻合,很神奇,對么?

            對我們常見的32位整數而言,公式:
            i ndex = (value * 2654435769) >> 28

            如果用這種斐波那契散列法的話,那我上面的圖就變成這樣了:


            很明顯,用斐波那契散列法調整之后要比原來的取摸散列法好很多。

            【適用范圍】

            快速查找,刪除的基本數據結構,通常需要總數據量可以放入內存。

            【基本原理及要點】
            hash函數選擇,針對字符串,整數,排列,具體相應的hash方法。
            碰撞處理,一種是open hashing,也稱為拉鏈法;另一種就是closed hashing,也稱開地址法,opened addressing。

            【擴展】
            d-left hashing中的d是多個的意思,我們先簡化這個問題,看一看2-left hashing。2-left hashing指的是將一個哈希表分成長度相等的兩半,分別叫做T1和T2,給T1和T2分別配備一個哈希函數,h1和h2。在存儲一個新的key時,同 時用兩個哈希函數進行計算,得出兩個地址h1[key]和h2[key]。這時需要檢查T1中的h1[key]位置和T2中的h2[key]位置,哪一個 位置已經存儲的(有碰撞的)key比較多,然后將新key存儲在負載少的位置。如果兩邊一樣多,比如兩個位置都為空或者都存儲了一個key,就把新key 存儲在左邊的T1子表中,2-left也由此而來。在查找一個key時,必須進行兩次hash,同時查找兩個位置。

            【問題實例】
            1).海量日志數據,提取出某日訪問百度次數最多的那個IP。

            IP的數目還是有限的,最多2^32個,所以可以考慮使用hash將ip直接存入內存,然后進行統計。

            做人要厚道,轉載請注明出處: http://diducoder.com/mass-data-topic-3-hash.html

            国产成人无码精品久久久免费 | 青青草国产精品久久久久| 久久久无码精品亚洲日韩按摩 | 精品人妻伦一二三区久久| 久久亚洲2019中文字幕| 人妻精品久久久久中文字幕一冢本 | 亚洲中文精品久久久久久不卡| 日日噜噜夜夜狠狠久久丁香五月| 久久久久国产一级毛片高清版| 青青青青久久精品国产h久久精品五福影院1421 | 狠狠狠色丁香婷婷综合久久五月| 91精品国产高清久久久久久国产嫩草| 久久夜色撩人精品国产| 99久久精品费精品国产一区二区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久婷婷人人澡人人爽人人爱| 久久精品国产精品亚洲精品| 一本色道久久88综合日韩精品| 97久久精品无码一区二区| 麻豆精品久久久久久久99蜜桃| 国内精品人妻无码久久久影院| 日本国产精品久久| 伊人久久免费视频| 国产麻豆精品久久一二三| 久久久久久精品免费免费自慰| 久久99精品国产麻豆婷婷| 97久久精品人妻人人搡人人玩| 性欧美丰满熟妇XXXX性久久久 | 久久国产欧美日韩精品| 亚洲AV伊人久久青青草原| 久久综合综合久久97色| 国产精品久久免费| 久久夜色精品国产欧美乱| 青青草原综合久久大伊人| 偷窥少妇久久久久久久久| 久久久久久亚洲精品影院| 午夜精品久久久久久影视riav| 久久综合狠狠综合久久97色| 久久久久久久综合日本| 久久久久久久久久久免费精品| 久久久久亚洲AV成人网人人网站|