#fxhash #hash #no-std

no-std ritehash

一个小巧、快速、零依赖且no_std的fxhash分支。更新更频繁。

2个不稳定版本

0.2.0 2022年1月2日
0.1.0 2021年5月25日

#1302 in 算法

Download history 10/week @ 2024-03-12 29/week @ 2024-03-19 102/week @ 2024-03-26 55/week @ 2024-04-02 13/week @ 2024-04-09 36/week @ 2024-04-16 42/week @ 2024-04-23 23/week @ 2024-04-30 35/week @ 2024-05-07 93/week @ 2024-05-14 40/week @ 2024-05-21 61/week @ 2024-05-28 55/week @ 2024-06-04 47/week @ 2024-06-11 67/week @ 2024-06-18 109/week @ 2024-06-25

292 下载量/月
3 个crate中使用 (via workflow-i18n)

Apache-2.0 OR MIT

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");

基准测试

通常在fxhashu32u64或长度大于等于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)

无运行时依赖