2个不稳定版本
0.2.0 | 2022年1月2日 |
---|---|
0.1.0 | 2021年5月25日 |
#1302 in 算法
292 下载量/月
在 3 个crate中使用 (via workflow-i18n)
14KB
212 行
RiteLabs的Fx Hash
一个小巧、快速、零依赖且no_std的fxhash分支。更新更频繁。
此散列算法是从Rustc编译器中提取出来的。这是Firefox中一些内部操作使用的相同散列算法。此算法的强度在于在64位平台上每次散列8个字节,而FNV算法是逐字节进行散列。
免责声明
这不是一种加密安全的散列,因此强烈建议您不要将此散列用于加密目的。此外,此散列算法并未设计为防止任何用于确定碰撞的攻击,这可能会在HashMap
中造成二次行为。因此,不建议在可能存在碰撞或DDoS攻击的地方公开此散列。
示例
默认Fx散列器的构建器。
use std::hash::BuildHasherDefault;
pub type FxBuildHasher = BuildHasherDefault<FxHasher>;
构建基于Fx的hashmap。
pub type FxHashMap<K, V> = HashMap<K, V, FxBuildHasher>;
let mut hashmap = FxHashMap::default();
hashmap.insert("black", 0);
hashmap.insert("white", 255);
构建基于Fx的hashset。
pub type FxHashSet<V> = HashSet<V, FxBuildHasher>;
let mut hashset = FxHashSet::default();
hashset.insert("black");
hashset.insert("white");
基准测试
通常在fxhash
在u32
、u64
或长度大于等于5的任何字节序列上比fnv
更快。然而,请注意,散列速度并不是唯一值得考虑的特性。话虽如此,当Rustc从基于fnv
的hashmap切换到基于fx
的hashmap时,速度有所提高。
test bench_fnv_003 ... bench: 1 ns/iter (+/- 0)
test bench_fnv_004 ... bench: 2 ns/iter (+/- 0)
test bench_fnv_011 ... bench: 6 ns/iter (+/- 0)
test bench_fnv_012 ... bench: 6 ns/iter (+/- 0)
test bench_fnv_023 ... bench: 14 ns/iter (+/- 1)
test bench_fnv_024 ... bench: 14 ns/iter (+/- 0)
test bench_fnv_068 ... bench: 61 ns/iter (+/- 4)
test bench_fnv_132 ... bench: 132 ns/iter (+/- 43)
test bench_fx_003 ... bench: 1 ns/iter (+/- 0)
test bench_fx_004 ... bench: 1 ns/iter (+/- 0)
test bench_fx_011 ... bench: 2 ns/iter (+/- 0)
test bench_fx_012 ... bench: 2 ns/iter (+/- 0)
test bench_fx_023 ... bench: 3 ns/iter (+/- 0)
test bench_fx_024 ... bench: 3 ns/iter (+/- 0)
test bench_fx_068 ... bench: 5 ns/iter (+/- 0)
test bench_fx_132 ... bench: 12 ns/iter (+/- 1)
test bench_seahash_003 ... bench: 29 ns/iter (+/- 0)
test bench_seahash_004 ... bench: 29 ns/iter (+/- 0)
test bench_seahash_011 ... bench: 26 ns/iter (+/- 0)
test bench_seahash_012 ... bench: 27 ns/iter (+/- 1)
test bench_seahash_023 ... bench: 27 ns/iter (+/- 1)
test bench_seahash_024 ... bench: 28 ns/iter (+/- 4)
test bench_seahash_068 ... bench: 31 ns/iter (+/- 3)
test bench_seahash_132 ... bench: 35 ns/iter (+/- 1)