有想過hash["a1"] = datetime.now;這句是怎麼實現的嗎?我們來重溫下學校時代就學過的雜湊演算法吧。
我們要寫個class,實現如下主程式呼叫:
static一看,也確實挺簡單的,就是乙個所引器,如下:void main(string
args)
class程式中要儲存的物件,最終是要儲存在乙個陣列中的,而且需要通過乙個轉換函式來進行string key與陣列index的map,如下:myhash
set }
}
private liststring, object>>> lstarray = new liststring, object>>>(defaultsize);這個函式是遍歷string key的每個char,累加,最終取模(同陣列的長度),這樣得出的乙個value肯定就在陣列範圍內。private
int mapstring2int(string
key)
如果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儲存引擎是通過事務來保證資料的一致性的 資料庫事務通常包含了乙個序列的對資料庫的讀 寫操作包含有以下兩個目的 為資料庫操作序列提供了乙個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使再異常狀態下仍能保持一致性的方法 當多個應用程式再併發訪問資料庫時,可以再這些應用程式之間...