哈希表

哈希表(百度百科)
 
一般的線性表、樹中,記錄在結構中的相對位置是隨機的即和記錄的關鍵字之間不存在確定的關係,在結構中查找記錄時需進行一系列和關鍵字的比較。這一類查找方法建立在“比較”的基礎上,查找的效率與比較次數密切相關。理想的情況是能直接找到需要的記錄,因此必須在記錄的存儲位置和它的關鍵字之間建立一確定的對應關係f,使每個關鍵字和結構中一個唯一的存儲位置相對應。因而查找時,只需根據這個對應關係f找到給定值K的像f(K)。若結構中存在關鍵字和K相等的記錄,則必定在f(K)的存儲位置上,由此不需要進行比較便可直接取得所查記錄。在此,稱這個對應關係f爲哈希函數,按這個思想建立的表爲哈希表(又稱爲雜湊法或散列表)。
  哈希表不可避免衝突(collision)現象:對不同的關鍵字可能得到同一哈希地址 即key1≠key2,而f(key1)=f(key2)。具有相同函數值的關鍵字對該哈希函數來說稱爲同義詞(synonym)。 因此,在建造哈希表時不僅要設定一個好的哈希函數,而且要設定一種處理衝突的方法。可如下描述哈希表:根據設定的哈希函數H(key)和所選中的處理衝突的方法,將一組關鍵字映象到一個有限的、地址連續的地址集(區間)上並以關鍵字在地址集中的“象”作爲相應記錄在表中的存儲位置,這種表被稱爲哈希表。
  注:這個函數f(key)爲哈希函數。(注意:這個函數並不一定是數學函數) 哈希函數是一個映象,即:將關鍵字的集合映射到某個地址集合上,它的設置很靈活,只要這個地址集合的大小不超出允許範圍即可。 現實中哈希函數是需要構造的,並且構造的好才能使用的好。
  對於動態查找表而言,1) 表長不確定;2)在設計查找表時,只知道關鍵字所屬範圍,而不知道確切的關鍵字。因此,一般情況需建立一個函數關係,以f(key)作爲關鍵字爲key的錄在表中的位置,通常稱這個函數f(key)爲哈希函數。(注意:這個函數並不一定是數學函數)
  哈希函數是一個映象,即:將關鍵字的集合映射到某個地址集合上,它的設置很靈活,只要這個地址集合的大小不超出允許範圍即可。
  現實中哈希函數是需要構造的,並且構造的好才能使用的好。
  用途:加密,解決衝突問題。。。。
  用途很廣,比特精靈中就使用了哈希函數,你可 以自己看看。
  具體可以學習一下數據結構和算法的書。
  字符串哈希函數(著名的ELFhash算法)
  int ELFhash(char *key)
  { unsigned long h=0;
  while(*key)
  { h=(h<<4)+*key++;
  unsigned long g=h&0Xf0000000L;
  if(g) h^=g>>24;
  h&=~g;
  }
  return h%MOD;
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章