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


相关文章
|
7月前
|
机器学习/深度学习 算法 安全
密码学系列之五:MD5、SHA1——一文搞懂哈希函数
密码学系列之五:MD5、SHA1——一文搞懂哈希函数
3891 0
|
Rust 算法 安全
【密码学】一文读懂MurMurHash2
上次我们聊过了一代的MurMurHash算法,是的,我又来水文章了,今天呢,接着来聊一下二代的MurMurHash算法,二代算法的整体结构实际上和一代算法差不太多,只是对于每一轮数据的处理过程当中的运算有一些差异,算法的来源依然是来自于Google官网给提供的源码,对着源码看的结构,对于这个算法呢,有两个版本,一个是32位的,一个是64位的,对于32位的算法和64位的算法,区别在于两个初始的魔数不同,整体运算过程还是十分相似的。
2224 0
【密码学】一文读懂MurMurHash2
|
Rust 算法 网络安全
【密码学】一文读懂CMAC
介于上一篇文章比较水,然后这个和上一篇也比较相似,CMAC是为了解决DAA当中安全性不足的问题而出现的,这个算法一共有三个密钥,K, K1, K2, 其中K1和K2可以由K导出,接下来就来一起看一下CMAC的具体过程吧,这一篇文章其实也不长。
3786 0
【密码学】一文读懂CMAC
|
Rust 算法 Go
【密码学】一文读懂MurMurHash3
本文应该是MurMurHash算法介绍的最后一篇,来一起看一下最新的MurMurHash算法的具体过程,对于最新的算法来说,整个流程和之前的其实也比较相似,这里从维基百科当中找到了伪代码,也就不贴出来Google官方给出的推荐代码了,先来看一下维基百科给出的伪代码,这里只有32位的伪代码。
2191 0
【密码学】一文读懂MurMurHash3
|
算法 数据安全/隐私保护
【密码学】一文读懂Whirlpool
首先呢,祝大家今晚节日快乐,Whirlpool是由Vincent Rijmen(高级加密标准的联合创始人)和Paulo S.L.M.Barreto设计的,后者于2000年首次提出了它。
1119 0
【密码学】一文读懂Whirlpool
|
Web App开发 Rust 算法
【密码学】一文读懂ChaCha20
好久没写新的加密算法的原理了, 这次所选取的加密算法结构比较简单, 一起来看一下吧。
7809 0
【密码学】一文读懂ChaCha20
|
算法 安全 Go
【密码学】一文读懂HKDF
我这又来水一篇文章,来聊一下HKDF(基于HMAC的密钥导出函数)。密钥派生函数是密钥管理的组成部分,他的目标是通过一些初始的数据派生出来密码学安全的随机密钥。
3120 1
【密码学】一文读懂HKDF
|
算法 数据安全/隐私保护
【密码学】一文读懂SHA-1
SHA-1(Secure Hash Algorithm 1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦资料处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
1224 1
【密码学】一文读懂SHA-1
|
算法 搜索推荐 安全
【密码学】一文读懂CCM
本文简单介绍了CCM模式下的认证和加密机制,实际上这个是AES-CTR模式和CMAC的一个组合,如果理解了前面这两个,本文应该还是比较好理解的。
3417 0
【密码学】一文读懂CCM
|
算法 安全
【密码学】一文读懂MD2
MD2是Ranald Rivest在1989年提出的哈希函数,本文主要介绍一下MD2算法的基本原理,尽管现在MD2已经并不安全,作为一个结构比较简单的哈希函数,学习一下还是十分有必要的。
1463 0
【密码学】一文读懂MD2