雜湊演算法是怎麼實現的

2022-02-08 04:28:12 字數 1254 閱讀 3430

有想過hash["a1"] = datetime.now;這句是怎麼實現的嗎?我們來重溫下學校時代就學過的雜湊演算法吧。

我們要寫個class,實現如下主程式呼叫:

static

void main(string

args)

一看,也確實挺簡單的,就是乙個所引器,如下:

class

myhash

set }

}

程式中要儲存的物件,最終是要儲存在乙個陣列中的,而且需要通過乙個轉換函式來進行string key與陣列index的map,如下:

private liststring, object>>> lstarray = new liststring, object>>>(defaultsize);

private

int mapstring2int(string

key)

這個函式是遍歷string key的每個char,累加,最終取模(同陣列的長度),這樣得出的乙個value肯定就在陣列範圍內。

如果2個key轉換出來的index相同呢?會導致衝突,乙個最簡單的解決辦法是把陣列中的每個元素變成list, 也就是說,如果string key轉換後出現了相同的index,沒關係,只要把那2個元素都放在那個index所標識的陣列位置中即可,本文中用的是list>。

下面是整個程式的**:

class

program

}class

myhash

}public

object

this[string

key]

set }

private tuple findbykey(string key, out liststring, object>>lst)

}return

obj;

}private

static

void ensurenotnull(string

key)

private

int mapstring2int(string

key)

相應的index為:

", key, hashindex));

return

hashindex;}}

執行效果圖:

什麼是雜湊演算法 雜湊函式 雜湊函式?

舉個例子,比如這裡有一萬首歌,給你一首新的歌x,要求你確認這首歌是否在那一萬首歌之內。無疑,將一萬首歌乙個乙個比對非常慢。但如果存在一種方式,能將一萬首歌的每首資料濃縮到乙個數字 稱為雜湊碼 中,於是得到一萬個數字,那麼用同樣的演算法計算新的歌x的編碼,看看歌x的編碼是否在之前那一萬個數字中,就能知...

ReenterLock內部是怎麼實現的

reentrantlock內部有公平鎖和非公平鎖兩種,而這兩種鎖都是基於aqs同步器實現的。aqs同步器太難看懂,先簡單看下reentrantlock的原始碼,再反推回去看aqs。1 公平鎖能保證 老的執行緒排隊使用鎖,新執行緒仍然排隊使用鎖。2 非公平鎖保證 老的執行緒排隊使用鎖 但是無法保證新執...

Mysql是怎麼實現事務的

mysql的innodb儲存引擎是通過事務來保證資料的一致性的 資料庫事務通常包含了乙個序列的對資料庫的讀 寫操作包含有以下兩個目的 為資料庫操作序列提供了乙個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使再異常狀態下仍能保持一致性的方法 當多個應用程式再併發訪問資料庫時,可以再這些應用程式之間...