哈希与安全

FNV 哈希生成器

计算任意文本的 32 位或 64 位 FNV-1 或 FNV-1a 哈希。

给这个工具评分

如何使用 FNV 哈希生成器

  1. 在输入框中键入或粘贴您的文本。
  2. 选择变体——通常推荐使用 FNV-1a。
  3. 哈希值会随输入实时显示;点击“复制”即可获取。

关于 FNV 哈希生成器

FNV——Fowler–Noll–Vo,得名于 Glenn Fowler、Landon Curt Noll 和 Phong Vo——是最出色的小型算法之一。整个算法就是对字节的一个循环,只做乘以一个固定素数再异或这一件事。没有查找表,没有轮次,没有缓冲区;用任何语言写都只需几行代码,可以在任何地方运行,而且速度快到没人会去做性能分析。这正是它在哈希表、符号表、缓存和解释器中随处可见的原因。

这两个变体看起来几乎一模一样,差异很容易被忽略。FNV-1a 与 FNV-1 的唯一区别是交换了异或和乘法的顺序——仅此而已。但事实证明这一点很重要:先做异或能带来明显更好的分布效果,尤其是在短输入以及仅最后一个字节不同的输入上——这恰恰是哈希表在处理 user_1user_2user_3 这类键时会遇到的情况。这就是为什么 FNV-1a 通常是被推荐的变体,也是本工具默认选用它的原因。只有当你需要与已经使用 FNV-1 的现有系统保持一致时,才应选择 FNV-1。

另一个可选项是位数。32 位变体输出 8 个十六进制字符;64 位变体输出 16 个。位数更多并不意味着“更安全”——它只是意味着在哈希大量键时,意外碰撞会更少,所以当键的数量达到百万级别时,64 位就值得采用了。所有 FNV 变体都不是密码学哈希。它们是为速度和分散性而设计的,不具备任何抗攻击能力,构造出两个 FNV 哈希相同的字符串是很容易的事。请将它们用于查找和分桶;当结果需要经得起有人蓄意破解时,请改用 SHA-256

常见问题

FNV-1 和 FNV-1a 有什么区别?

只是两个操作的顺序不同:FNV-1 先乘后异或,FNV-1a 先异或后乘。正是这一次顺序调换让 FNV-1a 拥有更好的分布效果,因此它是通常被推荐的版本。

我应该使用 32 位还是 64 位变体?

32 位(8 个十六进制字符)足以应付普通的哈希表。当你需要哈希数百万个键、并希望意外碰撞保持罕见时,再改用 64 位(16 个十六进制字符)。

FNV 安全吗?

不安全。FNV 是为速度而生的非密码学哈希,绝不能用于密码、签名或抵御攻击者的完整性校验——碰撞可以被蓄意构造出来,而且代价很低。

FNV 实际上适合用在什么地方?

哈希表、字典、符号表、缓存键、分片与分桶——任何你需要从字符串快速得到一个分布良好的数字、且没有人试图刻意作弊的场景。

我的文本会被发送到别处吗?

您的文本会被发送到我们的服务器进行哈希计算,因为浏览器无法计算 FNV。计算完成后会立即丢弃——绝不记录,绝不存储。