hash演算法的底層實現邏輯及衝突的解決方式

2021-10-04 05:56:19 字數 1490 閱讀 4755

很多小夥伴面試時,會碰到面試官問到如何解決雜湊衝突的問題,要理解雜湊衝突,首先要弄清楚hash函式和hash表(雜湊); 

一、雜湊表

hash函式:所謂hash函式其實就是指一類加密演算法(md5/sha等),將任意長度的輸入變換為固定長度的輸出的不可逆的單向密碼體制,即index=hash(key);

簡單的講,hash函式就是根據key值計算出資料應該存放的位址,而雜湊表則是基於雜湊函式建立的一種查詢表;

二、常見hash函式的構造方法

2、數字分析法:假設關鍵字集合中的每個關鍵字key都是由s位數字組成(key1,key2,key3,....,keyn),分析key中的全體資料,並從中提取分布均勻的若干位或他們的組合構成全體;

3、平均取中法:如果關鍵字的每一位都有某些數字重複出現頻率很高的現象,可以先求關鍵字的平方值,通過平方擴大差異,而後取中間數字作為最終儲存位址;

4、摺疊法:如果數字的位數很多,可以將數字分割為幾個部分,取他們的疊加和作為hash位址;

5、除留餘數法:h(key)=key mod p (p<=m m為表長)

三、hash衝突的常見解決方案

不論hash函式設計的如何巧妙,總會有特殊的key導致hash衝突,即h(key1)=h(key2),特別是對動態查詢表來說,為了解決此類衝突,有以下幾種方案:

1、開放定址法(開放定址法):

首先有乙個h(key)的雜湊函式

如果h(key1)=h(keyi)

那麼keyi儲存位置hi=(hash(key)+di) mod m   (m為hash表長度)

di通常有三種取法:

1)線性探測再雜湊:di​=c∗i

2) 平方探測再雜湊:di = 1^2,-1^2,2^2,-2^2....

3) 隨機探測再雜湊(雙探測再雜湊):di​是一組偽隨機數列

2、鏈位址法:

產生hash衝突後在儲存資料後面新增乙個指標,指向後面衝突的資料,如下所示:

3、公共溢位區法:建立乙個特殊儲存空間,專門存放衝突的資料,此種方法適用於資料和衝突較少的情況

4、再hash法(再雜湊法):準備若干個hash函式,如果使用第乙個hash函式發生了衝突,則換乙個hash函式,以此類推...

1.計算雜湊位址所需要的時間(即hash函式本身不要太複雜)

2.關鍵字的長度

3.hash表的長度

4.關鍵字分布是否均勻,是否有規律可循

5.設計的hash函式在滿足以上條件的情況下應儘量減少衝突

談談LruCache演算法的底層實現原理及其內部原始碼

我們在對資料進行操作的時候,為了避免流量或者效能的消耗,我們對於一些資料都會進行快取處理,而對資料的快取的要點不僅僅只有我們所熟悉的儲存快取和使用快取,還有刪除快取。對於新增和獲取快取很好理解,那麼為什麼還要對快取進行刪除吶?原因很簡單,因為我們的手機容量是有限的,如果我們拼命的寫入快取,那麼終有一...

談談LruCache演算法的底層實現原理及其內部原始碼

我們在對資料進行操作的時候,為了避免流量或者效能的消耗,我們對於一些資料都會進行快取處理,而對資料的快取的要點不僅僅只有我們所熟悉的儲存快取和使用快取,還有刪除快取。對於新增和獲取快取很好理解,那麼為什麼還要對快取進行刪除吶?原因很簡單,因為我們的手機容量是有限的,如果我們拼命的寫入快取,那麼終有一...

註解底層是怎麼實現業務邏輯的

通過以下例子來解釋 首先寫乙個介面並實現這個介面 隨便建乙個介面,這裡就寫乙個userservice public inte ce userservice 然後實現userservice介面,並隨意寫一些方法用來測試 public class userserviceimpl implements u...