【密码学】一文读懂FNV Hash

简介: FNV哈希全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出。它可以快速hash大量的数据并保持较小的冲突概率,适合hash一些相近的字符串比如IP地址、URL、文件名等等。目前FNV算法有三个版本,分别是: FNV-0(已废弃)、FNV-1以及FNV-1a。这三个算法的结构非常相似,因此呢,在这里就一块说了。

【密码学】一文读懂FNV Hash


C7}O74Z9T0JU%ZVQHNQ8(OY.jpgFNV


算法概述

FNV哈希全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出。它可以快速hash大量的数据并保持较小的冲突概率,适合hash一些相近的字符串比如IP地址、URL、文件名等等。目前FNV算法有三个版本,分别是: FNV-0(已废弃)、FNV-1以及FNV-1a。这三个算法的结构非常相似,因此呢,在这里就一块说了。


算法结构

总体来说,FNV-0、FNV-1以及FNV-1a都有两个参数,第一个是offset,第二个是一个素数,对于FNV-0来说OFFSET是0,然后PRIME和FNV-1一致,流程也和FNV-1一致,然后FNV-1和FNV-1a的区别是先算异或还是先算乘法,其他的也都是相同的,具体如下图,应该是比较清晰了。

]Z2S8%WWX$GX{QH52VTZRUJ.pngFNV-HASH结构

整个FNV-HASH的结构到这里其实就讲完了,然后发现本文的字数有点少,再来瞎聊几句,凑一下字数吧。

在我用Go写FNV-HASH的实现的时候,发现Go居然内置了这个算法,灰常是神奇,具体Go的代码在下面的链接当中

然后他有了,咱这就借鉴一下官方实现就好了,因此呢,下面Go的代码我就不给出来了,官方的实现实际上比我上面讲的要多,但是对于32位哈希来说是一样的,下面我来写个已经废弃的FNV-0吧,主体代码格式借鉴官方库来了。


代码实现

  • Go
package fnv
import (
  "hash"
)
const offset32 = 0
const prime32 = 16777619
type sum32 uint32
func New32() hash.Hash32 {
  var s sum32 = offset32
  return &s
}
func (s *sum32) Write(data []byte) (n int, err error) {
  h := *s
  for _, c := range data {
    h *= prime32
    h ^= sum32(c)
  }
  *s = h
  return len(data), nil
}
func (s *sum32) Sum(in []byte) []byte {
  v := uint32(*s)
  return append(in, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
}
func (s *sum32) Reset() {
  *s = offset32
}
func (s *sum32) Size() int {
  return 4
}
func (s *sum32) BlockSize() int {
  return 1
}
func (s *sum32) Sum32() uint32 {
  return uint32(*s)
}
  • Rust

rust这就佛系实现了,简单来写

fn fnv0(data: &[u8]) -> u32 {
    let mut h = 0u32;
    for &item in data {
        h = h.wrapping_mul(16777619);
        h ^= item as u32;
    }
    h
}


相关文章
|
Rust 算法 Go
【密码学】一文读懂MurMurHash3
本文应该是MurMurHash算法介绍的最后一篇,来一起看一下最新的MurMurHash算法的具体过程,对于最新的算法来说,整个流程和之前的其实也比较相似,这里从维基百科当中找到了伪代码,也就不贴出来Google官方给出的推荐代码了,先来看一下维基百科给出的伪代码,这里只有32位的伪代码。
3366 0
【密码学】一文读懂MurMurHash3
|
机器学习/深度学习 算法 安全
密码学系列之五:MD5、SHA1——一文搞懂哈希函数
密码学系列之五:MD5、SHA1——一文搞懂哈希函数
11008 113
|
Web App开发 Rust 算法
【密码学】一文读懂ChaCha20
好久没写新的加密算法的原理了, 这次所选取的加密算法结构比较简单, 一起来看一下吧。
10585 154
【密码学】一文读懂ChaCha20
|
Rust 算法 安全
【密码学】一文读懂MurMurHash2
上次我们聊过了一代的MurMurHash算法,是的,我又来水文章了,今天呢,接着来聊一下二代的MurMurHash算法,二代算法的整体结构实际上和一代算法差不太多,只是对于每一轮数据的处理过程当中的运算有一些差异,算法的来源依然是来自于Google官网给提供的源码,对着源码看的结构,对于这个算法呢,有两个版本,一个是32位的,一个是64位的,对于32位的算法和64位的算法,区别在于两个初始的魔数不同,整体运算过程还是十分相似的。
3037 0
【密码学】一文读懂MurMurHash2
|
Web App开发 关系型数据库 数据库
用PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC查询
用PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC查询作者digoal 日期2017-12-05 标签PostgreSQL , 搜索引擎 , GIN , ranking , high light , 全文检索 , 模糊查询 , 正则查询 , 相似查询 , ADHOC查询 背景字符串搜索是非常常见的业务需求,它包括: 1、前缀+模糊查询。
13232 1
|
12月前
|
搜索推荐 测试技术 C语言
NPU适配推荐系统GR模型流程
本示例将开源Generative Recommendations模型迁移至NPU训练,并通过HSTU融合算子优化性能。基于Atlas 800T A2平台,使用PyTorch 2.1.0、Python 3.11.0等环境。文档涵盖容器启动、依赖安装、算子适配、源码修改、数据预处理及配置文件设置等内容。性能测试显示,使用HSTU融合算子可显著降低端到端耗时(如ml_1m数据集单step从346ms降至47.6ms)。
|
存储 缓存 负载均衡
图解一致性哈希算法,看这一篇就够了!
近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法。
29672 66
图解一致性哈希算法,看这一篇就够了!
|
存储 关系型数据库 MySQL
【面试】Mysql主键索引普通索引索引和唯一索引的区别是什么?
【面试】Mysql主键索引普通索引索引和唯一索引的区别是什么?
1733 0
【面试】Mysql主键索引普通索引索引和唯一索引的区别是什么?
|
编译器 图形学 C语言
SSE2 指令集简介以及与SSE的差别
SSE2,Intel在2001年为Pentium 4引入的扩展,增强了SSE的功能,添加了对双精度浮点和64位整数运算的支持,新增144条指令,提升向量处理能力。SSE2的C代码示例展示了如何通过`_mm_add_ps`加速向量加法。启用SSE2编译器支持可优化处理图像、音频和视频等大量计算任务的性能。
|
数据可视化 Java 程序员
通过文字图像——代码图形注释自动生成
大家在学(CTRL)习(C)别人代码的时候,看到别人的代码程序,在日志中有很多很酷的代码注释,或者是有一些图形化注释方便理解。之前本人以为都是一个个手敲出来的。然后在网上一番搜索,找到了很多神奇的好网站,以用于图形注释生成。 代码图形注释自动生成技术是一种将代码逻辑和结构可视化的创新工具。它通过解析编程代码,并将代码的功能、结构和逻辑关系转换成直观的图形注释,从而使得程序员能够更加轻松地理解和分析代码。这种技术特别适合于复杂代码的解读,帮助开发人员快速定位代码中的关键部分和潜在问题。此外,对于团队合作和代码教育来说,图形注释可以作为沟通和学习的桥梁,让代码的理解变得更加直观和高效。总的来说,
532 0