跳转到内容

算法实现/哈希

来自维基教科书,开放的书籍,面向开放的世界

哈希算法通常分为三个子集

索引算法
通常用于快速查找项目,使用称为“哈希表”的列表。
校验和
常用于简单的數據檢查,以檢測通信過程中發生的任何意外位錯誤 - 我们在前面一章中讨论了它们,校验和
消息摘要
一种密码学安全的单向函数,在计算机安全领域,许多函数的安全性都经过了严格的审查。

索引算法

[编辑 | 编辑源代码]

Jenkins 一次性哈希

[编辑 | 编辑源代码]

来自 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 哈希函数CityHashMurmurHash。可能希望使用带密钥的哈希函数来抵抗 “哈希泛滥”:现代实现使用 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。

虽然这些算法可以直接从规范中实现,但与其他形式的 密码学 一样,使用经过彻底审查的开源库通常更安全、更快。

进一步阅读

[编辑 | 编辑源代码]


参考文献

[编辑 | 编辑源代码]
华夏公益教科书