我正在尝试将FNV散列算法集成到基于 PHP 的项目中,作为为各种数据(例如 URL、关键字)生成散列的要求的一部分。
我看到了 Neven Boyanov 的这个实现。他提到由于 PHP 中的算术限制,他被迫使用按位移位和加法而不是乘法。他的实现正确吗?我的知识在计算机科学领域受到某种限制,因此我无法自己验证。
我的另一个问题是关于 FNV 的不同“风味”。我看到它提供了 32 位、64 位和 128 位变体,但使用上述实现我总是得到 8 个字符的十六进制哈希(我使用 dechex() 将整数结果转换为十六进制)。
给定输入“Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin at libero mi, quis luctus massa.”,我得到以下十六进制结果:
- (32 位偏移) 5b15c0f2
- (64 位偏移)6ea33cb5
为什么会这样?我期待来自 64 位 FNV 的 16 个字符的十六进制结果。“风味”是否仅指将使用的算术运算和种子类型而不是结果的长度?(即如果我说 64 位 FNV,散列函数将使用 64 位操作和种子,但结果仍然是 32 位)
一点启发将不胜感激:)