咱們知道,經過對數組
進行直接尋址
(Direct Addressing)
,能夠在 O(1)
時間內訪問數組中的任意元素。因此,若是存儲空間容許,能夠提供一個數組,爲每一個可能的關鍵字保留一個位置,就能夠應用直接尋址技術。算法
hash 算法能以空間換時間。經過 hash,生成不可逆的信息摘要數組
哈希表(Hash Table)
是普通數組概念的推廣。當實際存儲的的關鍵字數比可能的關鍵字總數較小時,這時採用哈希表就會比使用直接數組尋址更爲有效。由於哈希表一般採用的數組尺寸與所要存儲的關鍵字數是成比例的。安全
哈希表是一種動態集合數據結構,在一些合理的假設下,在哈希表中查找一個元素的指望時間是 O(1) 。數據結構
哈希表(Hash table
,也叫散列表),是根據關鍵碼
值(Key value)而直接進行訪問的數據結構。也就是說,它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫作散列函數,存放記錄的數組叫作散列表。函數
哈希表的作法其實很簡單,就是把Key經過一個固定的算法函數既所謂的哈希函數轉換成一個整型數字,而後就將該數字對數組長度進行取餘,取餘結果就看成數組的下標,將value存儲在以該數字爲下標的數組空間裏。性能
什麼是Hash
Hash,通常翻譯作「散列」,也有直接音譯爲「哈希」的,就是把任意長度的輸入(又叫作預映射, pre-image),經過散列算法,變換成固定長度
的輸出,該輸出就是散列值。這種轉換是一種壓縮映射
,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,而不可能從散列值來惟一的肯定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。編碼
HASH主要用於信息安全領域中加密算法,它把一些不一樣長度的信息轉化成雜亂的128位的編碼,這些編碼值叫作HASH值. 也能夠說,hash就是找到一種數據內容和數據存放地址之間的映射關係。加密
數組的特色是:尋址容易,插入和刪除困難;
鏈表的特色是:尋址困難,插入和刪除容易。spa
那麼咱們能不能綜合二者的特性,作出一種尋址容易,插入刪除也容易的數據結構?答案是確定的,這就是咱們要提起的哈希表,哈希表有多種不一樣的實現方法,我接下來解釋的是最經常使用的一種方法——拉鍊法
,咱們能夠理解爲「鏈表的數組」,如圖:翻譯
hash表,有時候也被稱爲散列表。我的認爲,hash表是介於鏈表和二叉樹之間的一種中間結構。鏈表使用十分方便,可是數據查找十分麻煩;二叉樹中的數據嚴格有序,可是這是以多一個指針做爲代價的結果。hash表既知足了數據的查找方便,同時不佔用太多的內容空間,使用也十分方便。
打個比方來講,全部的數據就好像許許多多的書本。若是這些書本是一本一本堆起來的,就好像鏈表或者線性表同樣,整個數據會顯得很是的無序和凌亂,在你找到本身須要的書以前,你要經歷許多的查詢過程;而若是你對全部的書本進行編號,而且把這些書本按次序進行排列的話,那麼若是你要尋找的書本編號是n,那麼通過二分查找,你很快就會找到本身須要的書本;可是若是你每個種類的書本都不是不少,那麼你就能夠對這些書本進行歸類,哪些是文學類,哪些是藝術類,哪些是工科的,哪些是理科的,你只要對這些書本進行簡單的歸類,那麼尋找一本書也會變得很是簡單,好比說若是你要找的書是計算機方面的書,那麼你就會到工科一類當中去尋找,這樣查找起來也會顯得麻煩。
不知道這樣舉例你清楚了沒有,上面提到的歸類方法其實就是hash表的本質。
哈希表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫作散列函數,存放記錄的數組叫作散列表。
記錄的存儲位置=f(關鍵字)
這裏的對應關係f稱爲散列函數,又稱爲哈希(Hash函數),採用散列技術將記錄存儲在一塊連續的存儲空間中,這塊連續存儲空間稱爲散列表或哈希表(Hash table)。
哈希表hashtable(key,value) 就是把Key經過一個固定的算法函數既所謂的哈希函數轉換成一個整型數字,而後就將該數字對數組長度進行取餘,取餘結果就看成數組的下標,將value存儲在以該數字爲下標的數組空間裏。(或者:把任意長度的輸入(又叫作預映射, pre-image),經過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,而不可能從散列值來惟一的肯定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。)
而當使用哈希表進行查詢的時候,就是再次使用哈希函數將key轉換爲對應的數組下標,並定位到該空間獲取value,如此一來,就能夠充分利用到數組的定位性能進行數據定位。