跳轉至內容

演算法實現/雜湊

來自華夏公益教科書,開放的書籍,為了開放的世界

雜湊演算法通常分為三個子集

索引演算法
通常用於快速查詢專案,使用稱為“雜湊表”的列表。
校驗和
通常用於簡單的資料檢查,以檢測通訊過程中的意外位錯誤——我們在之前的章節中討論過它們,校驗和
訊息摘要
一種密碼學安全的單向函式,許多在計算機安全領域被仔細檢查其安全性。

索引演算法

[編輯 | 編輯原始碼]

Jenkins 一次性雜湊

[編輯 | 編輯原始碼]

“Jenkins 一次性雜湊”,來自 Bob Jenkins 在 1997 年 9 月《Dr. Dobb's》雜誌上的一篇文章

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 雜湊函式CityHashMurmurHash。可能需要使用帶金鑰的雜湊函式來抵禦 “雜湊氾濫”:現代實現使用 SipHash 用於此目的;其他使用 “通用”雜湊函式

校驗和和迴圈冗餘校驗

[編輯 | 編輯原始碼]

參見 演算法實現/校驗和

訊息摘要

[編輯 | 編輯原始碼]

訊息摘要的最新技術以及被認為安全的技術經常變化。美國國家安全域性舉辦演算法競賽,並選擇獲勝者作為 SHAs,“安全雜湊演算法”。

  • 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。

雖然這些演算法可以直接從規範中實現,但與其他形式的 密碼學 一樣,通常使用經過徹底審查的開源庫更安全、更快速。

進一步閱讀

[編輯 | 編輯原始碼]


參考文獻

[編輯 | 編輯原始碼]
華夏公益教科書