【密码学】一文读懂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
}


相关文章
|
机器学习/深度学习 算法 安全
密码学系列之五:MD5、SHA1——一文搞懂哈希函数
密码学系列之五:MD5、SHA1——一文搞懂哈希函数
10514 113
|
Web App开发 Rust 算法
【密码学】一文读懂ChaCha20
好久没写新的加密算法的原理了, 这次所选取的加密算法结构比较简单, 一起来看一下吧。
10326 154
【密码学】一文读懂ChaCha20
|
Rust 算法 安全
【密码学】一文读懂MurMurHash2
上次我们聊过了一代的MurMurHash算法,是的,我又来水文章了,今天呢,接着来聊一下二代的MurMurHash算法,二代算法的整体结构实际上和一代算法差不太多,只是对于每一轮数据的处理过程当中的运算有一些差异,算法的来源依然是来自于Google官网给提供的源码,对着源码看的结构,对于这个算法呢,有两个版本,一个是32位的,一个是64位的,对于32位的算法和64位的算法,区别在于两个初始的魔数不同,整体运算过程还是十分相似的。
2916 0
【密码学】一文读懂MurMurHash2
|
Python
Windows7 设置pip 镜像 Pip Warning:–trusted-host 问题解决方案
最近写了一篇关于“微软开源分布式高性能GB框架LightGBM安装使用”的文章,有小伙伴安装Python环境遇到了问题。我个人也尝试安装了一下,确实遇到了很多问题。这不又遇到;设置pip 镜像 Pip Warning:–trusted-host 问题。
3335 0
|
Web App开发 关系型数据库 数据库
用PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC查询
用PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC查询作者digoal 日期2017-12-05 标签PostgreSQL , 搜索引擎 , GIN , ranking , high light , 全文检索 , 模糊查询 , 正则查询 , 相似查询 , ADHOC查询 背景字符串搜索是非常常见的业务需求,它包括: 1、前缀+模糊查询。
13031 1
|
9月前
|
搜索推荐 测试技术 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)。
|
存储 缓存 负载均衡
图解一致性哈希算法,看这一篇就够了!
近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法。
27983 66
图解一致性哈希算法,看这一篇就够了!
|
Arthas Oracle Java
可观测可回溯 | Continuous Profiling 实践解析
我们定位异常时,时常无法知晓代码内部发生了什么,因此无从谈起修复和改善代码。​Continuous Profiling帮助开发者全面掌握、回溯生产环节代码执行细节,增强可观测性。​
可观测可回溯 | Continuous Profiling 实践解析
|
编译器 图形学 C语言
SSE2 指令集简介以及与SSE的差别
SSE2,Intel在2001年为Pentium 4引入的扩展,增强了SSE的功能,添加了对双精度浮点和64位整数运算的支持,新增144条指令,提升向量处理能力。SSE2的C代码示例展示了如何通过`_mm_add_ps`加速向量加法。启用SSE2编译器支持可优化处理图像、音频和视频等大量计算任务的性能。
|
网络协议 SDN 网络架构
用TCP穿透NAT(TCP打洞)的实现
1. TCP穿透原理:     我们假设在两个不同的局域网后面分别有2台客户机A和 B,AB所在的局域网都分别通过一个路由器接入互联网。互联网上有一台服务器S。     现在AB是无法直接和对方发送信息的,AB都不知道对方在互联网上真正的IP和端口, AB所在的局域网的路由器只允许内部向外主动发送的信息通过。
6111 0