演算法實現/雜湊
外觀
< 演算法實現
雜湊演算法通常分為三個子集
- 索引演算法
- 通常用於快速查詢專案,使用稱為“雜湊表”的列表。
- 校驗和
- 常用於簡單的資料檢查,以檢測通訊過程中發生的任何意外位錯誤 - 我們在前面一章中討論了它們,校驗和。
- 訊息摘要
- 一種密碼學安全的單向函式,在計算機安全領域,許多函式的安全性都經過了嚴格的審查。
來自 Bob Jenkins 在Dr. Dobb's 1997 年 9 月的文章 的“Jenkins 一次性雜湊”。
C
uint32 joaat_hash(uchar *key, size_t key_len) {
uint32 hash = 0;
size_t i;
for (i = 0; i < key_len; i++) {
hash += key[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
return hash;
}
Java
int joaat_hash(byte[] key) {
int hash = 0;
for (byte b : key) {
hash += (b & 0xFF);
hash += (hash << 10);
hash ^= (hash >>> 6);
}
hash += (hash << 3);
hash ^= (hash >>> 11);
hash += (hash << 15);
return hash;
}
有關“Jenkins 一次性雜湊”的更多詳細資訊,請參閱 資料結構/雜湊表#選擇一個好的雜湊函式。
其他流行的用於雜湊表的雜湊函式包括:其他 Jenkins 雜湊函式、CityHash 和 MurmurHash。可能希望使用帶金鑰的雜湊函式來抵抗 “雜湊氾濫”:現代實現使用 SipHash 來實現此目的;其他使用 “通用”雜湊函式。
請參閱 演算法實現/校驗和。
訊息摘要的最新技術和被認為安全的技術變化頻繁。美國國家安全域性舉辦演算法競賽,並選擇獲勝者作為 SHA,即“安全雜湊演算法”。
- MD5 (RFC 1321) 及其前身 MD2 和 MD4 都是被破解的。它們現在都已過時且不安全。
- SHA0/SHA1 (FIPS-180-1) 部分被破解。自 2005 年以來,它們已過時,並且被認為對資金雄厚的對手不安全。
- SHA-2 尚未被認為被破解,但容易受到長度擴充套件攻擊。
- SHA-3 (Keccak) 不容易受到長度擴充套件攻擊。
- KangarooTwelve 是 Keccak 的一個高度並行化(因此非常快)版本。它沒有經過國家安全域性的審查,但作者認為它與 SHA-3 一樣安全。
- BLAKE 是一個雜湊函式,它進入了 SHA-3 競賽的決賽。BLAKE2b 變體被廣泛使用,並且被認為是安全的(截至 2020 年)。它還具有一個高度並行化的版本,稱為 BLAKE3。
雖然這些演算法可以直接從規範中實現,但與其他形式的 密碼學 一樣,使用經過徹底審查的開源庫通常更安全、更快。
- 請參閱 資料結構/雜湊表,瞭解雜湊最常見的應用。
- 微軟 FCIV(檔案校驗和完整性驗證器)
- 從 VBA 執行 FCIV 實用程式
- VBA 中的字串雜湊
- VBA 中的檔案雜湊