跳转至内容

算法实现/哈希

来自维基教科书,开放的书籍,为了开放的世界

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

索引算法
通常用于快速查找项目,使用称为“哈希表”的列表。
校验和
通常用于简单的數據检查,以检测通信过程中的意外位错误——我们在之前的章节中讨论过它们,校验和
消息摘要
一种密码学安全的单向函数,许多在计算机安全领域被仔细检查其安全性。

索引算法

[编辑 | 编辑源代码]

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。

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

进一步阅读

[编辑 | 编辑源代码]


参考文献

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