#hash #hash-values #rolling #可分解

no-std 循环多项式-23

一个可滚动的可分解哈希算法

4个版本 (2个破坏性版本)

0.3.1 2024年2月10日
0.3.0 2022年3月19日
0.2.0 2022年1月19日
0.1.0 2021年12月31日

算法中排名265

Download history 8/week @ 2024-06-03 1/week @ 2024-06-24 1/week @ 2024-07-01 96/week @ 2024-07-22 7/week @ 2024-07-29 123/week @ 2024-08-05

每月226次下载
用于 2 crates

MIT/Apache

115KB
521

Docs

循环多项式

此crate实现了论文第2.3节中给出的哈希算法

Jonathan D. Cohen,n-Gram的递归哈希函数,ACM Trans. Inf. Syst. 15 (3),1997。

来自此论文的其他开源实现通常集中在后续章节中出现的其他算法。

与其他哈希算法相比,此哈希算法具有一些突出的特点

  • 该算法支持循环/滚动哈希计算。
    • 滚动哈希计算比Adler32快约5倍。
  • 哈希值可分解。

循环/滚动

滚动哈希(有时称为循环哈希),可以从先前的哈希值和数据的微小变化中计算新的哈希值。滚动哈希对于在数据集合上滑动窗口数据非常有用

Rolling Hash

这比为每个块重新计算哈希值要快得多。

滚动哈希是找到具有给定哈希值的块的效率方法。

可分解

可分解哈希,可以计算一个数据块的哈希值,给定一个更大数据块的哈希值和剩余数据的哈希值

Decomposable Hash

在上面的例子中,哈希 $h_3$ 可以从哈希 $h_1$ 和 $h_2$ 中计算出来。

其他算法

Adler32哈希/校验和算法可以用作滚动哈希,并由zlib库和rsync工具推广。

性能

在笔记本电脑上进行了性能比较,与adler32 crate进行了比较。要运行此比较,请执行cargo bench

单个块

在计算单个块时,循环多项式哈希比Adler32慢。

算法 MB/sec
循环多项式32位 2127
循环多项式64位 2126
Adler32 2562

滚动

滚动哈希的计算比Adler32快。

算法 MB/sec
循环多项式32位 1254
循环多项式64位 1048
Adler32 170

冲突

要计算随机数据的哈希冲突,请执行

cargo run --example collisions

这将输出冲突数。

算法 冲突
随机数生成器 118
循环多项式32位 140
Adler32 2872

货物特性

std

默认情况下,这个crate使用启用特征 std 的Rust标准库。如果作为没有默认特征的依赖项包含,crate支持no_std,例如。

cyclic-poly-23 = { version = "xxx", default-features = false }

依赖项