跳到主要内容

Appendix B. 先前的 IETF FNV 代码

中文导读: 本节对应 RFC 9923 的 Appendix B. 先前的 IETF FNV 代码 部分, 对应文档标题为 RFC 9923 - The FNV Non-Cryptographic Hash Algorithm. 下方若包含英文 RFC 原文, 注册表名称, 字段名, 算法名, 对象标识符, 媒体类型, 邮箱地址, URL, 代码, ABNF, ASN.1, YANG, JSON, XML, 测试向量或参考文献条目, 均按规范原样保留, 因为这些内容需要与 RFC 文本, IANA 注册表, 实现代码或验证工具逐字一致. 中文段落用于说明本节的作用, 阅读重点和实现含义, 不改变任何协议语义或注册值.

本页包含的英文术语大多是协议标识符, 字段名, 章节名, 算法名或标准化缩写. 这些词在实现和互操作测试中通常按英文出现, 因此保留原文. 中文说明用于补足上下文, 帮助读者理解该节与整体协议行为, 安全边界, 部署约束或数据模型之间的关系.

FNV-1a 曾在 draft-ietf-tls-cached-info-08 中被引用 (该草案最终发布为 RFC 7924, 但 RFC 7924 不再包含下面的代码). 此处, 经作者友好许可, 我们提供该早期草案中的 FNV64 Java 代码:

/*
* Java code sample, implementing 64 bit FNV-1a
* By Stefan Santesson
*/

import java.math.BigInteger;

public class FNV {

static public BigInteger getFNV1a64Digest (String inpString) {

BigInteger m = new BigInteger("2").pow(64);
BigInteger fnvPrime = new BigInteger("1099511628211");
BigInteger fnvOffsetBasis = new BigInteger
("14695981039346656037");

BigInteger digest = fnvOffsetBasis;

for (int i = 0; i < inpString.length(); i++) {
digest = digest.xor(BigInteger.valueOf(
(int) inpString.charAt(i)));
digest = digest.multiply(fnvPrime).mod(m);
}
return (digest);

}
}