hash函式解析

2021-08-26 11:34:14 字數 3201 閱讀 7347

hash函式在多個領域均有應用,而在數字簽名和資料庫實現時又用的最多,比如基於hash的索引,是最好的單值查詢索引;

同時,在當前資料**的場景下,執行相似item的查詢時,在記憶體受限時,均可以採取lsh(local sensitive hash)進行分段處理。

具體用途很多,不贅述,下面介紹一些常用的知識:

1、hash函式本質;

2、簡單的hash函式生成法;

3、hash的衝突消解;

主要內容:

1、hash的本質

hash函式是指把乙個大範圍對映到乙個小範圍。把大範圍對映到乙個小範圍的目的往往是為了節省空間。在考慮使用hash函式之前,需要明白它的幾個限制:

(1). hash的主要原理就是把大範圍對映到小範圍;所以,你輸入的實際值的個數必須和小範圍相當或者比它更小。不然衝突就會很多。

(2). 由於hash逼近單向函式;所以,你可以用它來對資料進行加密。

(3). 不同的應用對hash函式有著不同的要求;比如,用於加密的hash函式主要考慮它和單項函式的差距,而用於查詢的hash函式主要考慮它對映到小範圍的衝突率。

hash函式好壞非評判標準:簡單和均勻。

簡單指雜湊函式的計算簡單快速;

均勻指對於關鍵字集合中的任一關鍵字,雜湊函式能以等概率將其對映到表空間的任何乙個位置上。也就是說,雜湊函式能將子集k隨機均勻地分布在表的位址集上,以使衝突最小化。

2、常用hash生成方法

常用的雜湊函式構造有6種方法,1,直接定址法; 2,數字分析法; 3 ,平方取中法;4,摺疊法;5,除留餘數法;6,偽隨機數法

(1)平方取中法

【例】將一組關鍵字(0100,0110,1010,1001,0111)平方後得

(0010000,0012100,1020100,1002001,0012321)

(100,121,201,020,123)。

相應的雜湊函式用c實現很簡單:

int hash(int key)

(2)除餘法

該方法是最為簡單常用的一種方法。它是以表長m來除關鍵字,取其餘數作為雜湊位址,即 h(key)=key%m

該方法的關鍵是選取m。選取的m應使得雜湊函式值盡可能與關鍵字的各位相關。m最好為素數。

【例】若選m是關鍵字的基數的冪次,則就等於是選擇關鍵字的最後若干位數字作為位址,而與高位無關。於是高位不同而低位相同的關鍵字均互為同義詞。

【例】若關鍵字是十進位制整數,其基為10,則當m=100時,159,259,359,…,等均互為同義詞。

(3)相乘取整法

該方法包括兩個步驟:首先用關鍵字key乘上某個常數a(0

3、hash的衝突消解

1)衝突是如何產生的?

上文中談到,雜湊函式是指如何對關鍵字進行編址的規則,這裡的關鍵字的範圍很廣,可視為無限集,如何保證無限集的原資料在編址的時候不會出現重複呢?規則本身無法實現這個目的。舉乙個例子,仍然用班級同學做比喻,現有如下同學資料

張三,李四,王五,趙剛,吳露.....

假如我們編址規則為取姓氏中姓的開頭字母在字母表的相對位置作為位址,則會產生如下的雜湊表

位置字母姓名0

a1b2

c ...10l

李四...22w

王五,吳露

..25

z張三,趙剛

我們注意到,灰色背景標示的兩行裡面,關鍵字王五,吳露被編到了同乙個位置,關鍵字張三,趙剛也被編到了同乙個位置。老師再拿號來找張三,座位上有兩個人,"你們倆誰是張三?"

2)如何解決衝突問題

a)開放位址法

開放地執法有乙個公式:hi=(h(key)+di) mod m i=1,2,...,k(k<=m-1)

其中,m為雜湊表的表長。di 是產生衝突的時候的增量序列。如果di值可能為1,2,3,...m-1,稱線性探測再雜湊。

如果di取1,則每次衝突之後,向後移動1個位置.如果di取值可能為1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2)

稱二次探測再雜湊。如果di取值可能為偽隨機數列。稱偽隨機探測再雜湊。仍然以學生排號作為例子,

現有兩名同學,李四,吳用。李四與吳用事先已排好序,現新來一名同學,名字叫王五,對它進行編制

10..

....

22..

..25

李四..

....

吳用..

..25

趙剛未來之前

10..

..22

2325

李四..

吳用王五

(a)線性探測再雜湊對趙剛進行編址,且di=1

10...

2022

..25

李四..

王五吳用

(b)二次探測再雜湊,且di=-2

1...

10...

22..

25王五..

李四..

吳用(c)偽隨機探測再雜湊,偽隨機序列為:5,3,2

b)再雜湊法

當發生衝突時,使用第二個、第三個、雜湊函式計算位址,直到無衝突時。缺點:計算時間增加。

比如上面第一次按照姓首字母進行雜湊,如果產生衝突可以按照姓字母首字母第二位進行雜湊,再衝突,第三位,直到不衝突為止

c)鏈位址法

將所有關鍵字為同義詞的記錄儲存在同一線性鍊錶中。如下:

因此這種方法,可以近似的認為是筒子裡面套筒子

d.建立乙個公共溢位區(比較常見於實際操作中)

假設雜湊函式的值域為[0,m-1],則設向量hashtable[0..m-1]為基本表,另外設立儲存空間向量overtable[0..v]用以儲存發生衝突的記錄。

經過以上方法,基本可以解決掉hash演算法衝突的問題。

注:之所以會簡單得介紹了hash,是為了更好的學習lzw演算法,學習lzw演算法是為了更好的研究gif檔案結構,最後,我將詳細的闡述一下gif檔案是如何構成的,如何高效操作此種型別檔案。

除了上訴的幾種方法,還有許多用於雜湊表的方法,比如雜湊函式不好或裝填因子過大,都會使堆積現象加劇。為了減少堆積的發生,不能像線性探查法那樣探查乙個順序的位址序列(相當於順序查詢),而應使探查序列跳躍式地雜湊在整個雜湊表中。衍生出二次探查法,雙重雜湊表法。

Hash函式和Hash衝突

2.rehash 3.鍊錶法 4.建立公共溢位區 一 簡介 將任意長度的數值以某個對映規則對映為固定長度的數值,這個過程稱為hash,而這個對映規則被稱為hash函式,而對這個key value進行儲存的資料結構被稱為hash表。由於通過key的hash對映直接得到了記憶體位址,所以hash查詢的時...

演算法收集 Hash解析 01 hash定義

hash雜湊演算法詳細解析 一 本文詳細描述了hash演算法的通用模式,在這個基礎上對目前作為標準的幾種主要hash演算法進行了一些分析 md5,ripemd系列,sha系列,tiger以及剛加入到標準不久的whirlpool。給出了部分演算法的 1 hash定義 傳統hash函式的定義 乙個has...

Hash學習(2) Hash函式

乙個好的hash函式一般具有以下兩個特點 第一,速度快,第二,能夠將雜湊鍵均勻的分布在整個表中,保證不會產生聚集。通常,hash函式具有如下形式 hash key calculated key tablesize 上一節主要討論了一下tablesize,為了提高雜湊鍵的離散程度,tablesize通...