8个稳定版本

使用旧的Rust 2015

1.0.7 2020年5月14日
1.0.6 2017年11月9日
1.0.5 2016年9月19日
1.0.4 2016年8月30日
1.0.0 2015年4月6日

#14 in 算法

Download history 1223006/week @ 2023-11-20 1390097/week @ 2023-11-27 1417094/week @ 2023-12-04 1455973/week @ 2023-12-11 1309622/week @ 2023-12-18 803882/week @ 2023-12-25 1225648/week @ 2024-01-01 1517811/week @ 2024-01-08 1522107/week @ 2024-01-15 1566067/week @ 2024-01-22 1651514/week @ 2024-01-29 1630793/week @ 2024-02-05 1622865/week @ 2024-02-12 1632289/week @ 2024-02-19 1743330/week @ 2024-02-26 1755266/week @ 2024-03-04

6,865,380 每月下载量
用于 26,937 个crate(601个直接使用)

Apache-2.0 / MIT

23KB
311

rust-fnv

Fowler–Noll–Vo散列函数的实现。

阅读文档

关于

FNV散列函数是一个定制的Hasher实现,对于较小的散列键更有效率。

Rust常见问题解答中提到,尽管默认的Hasher实现,SipHash,在许多情况下表现良好,但它与其他短键算法(如整数到其他值的映射)相比,速度明显较慢。在这些情况下,FNV的速度明显更快

其缺点是它在较大的输入上表现不佳,并且无法提供对碰撞攻击的保护,恶意用户可以设计特定的键来减慢散列器的速度。因此,确保您使用的是小散列键,并且您的程序不可能暴露于恶意输入(包括网络服务器)中,这一点非常重要。

Rust编译器本身使用FNV,因为它不担心拒绝服务攻击,并且可以假设其输入将是小的——这是FNV的一个完美的用例。

用法

要将此crate包含到您的程序中,请将以下内容添加到您的Cargo.toml

[dependencies]
fnv = "1.0.3"

在HashMap中使用FNV

FnvHashMap类型别名是使用带有FNV的标准库的HashMap的最简单方式。

use fnv::FnvHashMap;

let mut map = FnvHashMap::default();
map.insert(1, "one");
map.insert(2, "two");

map = FnvHashMap::with_capacity_and_hasher(10, Default::default());
map.insert(1, "one");
map.insert(2, "two");

注意,标准库的HashMap::newHashMap::with_capacity仅实现了RandomState散列器,因此使用Default来获取散列器是次优选项。

在 HashSet 中使用 FNV

同样地,FnvHashSet 是标准库中 HashSet 使用 FNV 的类型别名。

use fnv::FnvHashSet;

let mut set = FnvHashSet::default();
set.insert(1);
set.insert(2);

set = FnvHashSet::with_capacity_and_hasher(10, Default::default());
set.insert(1);
set.insert(2);

无运行时依赖

功能特性