Rollup merge of #77996 - tkaitchuck:master, r=m-ou-se
Doc change: Remove mention of `fnv` in HashMap Disclaimer: I am the author of [aHash](https://github.com/tkaitchuck/aHash). This changes the Rustdoc in `HashMap` from mentioning the `fnv` crate to mentioning the `aHash` crate, as an alternative `Hasher` implementation. ### Why Fnv [has poor hash quality](https://github.com/rurban/smhasher), is [slow for larger keys](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md#speed), and does not provide dos resistance, because it is unkeyed (this can also cause [other problems](https://accidentallyquadratic.tumblr.com/post/153545455987/rust-hash-iteration-reinsertion)). Fnv has acceptable performance for integers and has very poor performance with keys >32 bytes. This is the reason it was removed from the standard library in https://github.com/rust-lang/rust/pull/37229 . Because regardless of which dimension you value, there are better alternatives, it does not make sense for anyone to consider using `fnv`. The text mentioning `fnv` in the standard library continues to create confusion: https://github.com/rust-lang/hashbrown/issues/153 https://github.com/rust-lang/hashbrown/issues/9 . There are also a number of [crates using it](https://crates.io/crates/fnv/reverse_dependencies) a great many of which are hashing strings (Which is when Fnv is the [worst](https://github.com/cbreeden/fxhash#benchmarks), [possible](https://github.com/tkaitchuck/aHash#speed), [choice](http://cglab.ca/~abeinges/blah/hash-rs/).) I think aHash makes the most sense to mention as an alternative because it is the most credible option (in my obviously biased opinion). It offers [good performance on numbers and strings](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md#speed), is [of high quality](https://github.com/tkaitchuck/aHash#hash-quality), and [provides dos resistance](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks). It is popular (see [stats](https://crates.io/crates/ahash)) and is the default hasher for [hashbrown](https://crates.io/crates/hashbrown) and [dashmap](https://crates.io/crates/dashmap) which are the most popular alternative hashmaps. Finally it does not have any of the [`gotcha` cases](https://github.com/tkaitchuck/aHash#fxhash) that `FxHash` suffers from. (Which is the other popular hashing option when DOS attacks are not a concern) Signed-off-by: Tom Kaitchuck <tom.kaitchuck@emc.com>
This commit is contained in:
commit
ef32ef7baf
@ -34,8 +34,8 @@ use crate::sys;
|
|||||||
/// attacks such as HashDoS.
|
/// attacks such as HashDoS.
|
||||||
///
|
///
|
||||||
/// The hashing algorithm can be replaced on a per-`HashMap` basis using the
|
/// The hashing algorithm can be replaced on a per-`HashMap` basis using the
|
||||||
/// [`default`], [`with_hasher`], and [`with_capacity_and_hasher`] methods. Many
|
/// [`default`], [`with_hasher`], and [`with_capacity_and_hasher`] methods.
|
||||||
/// alternative algorithms are available on crates.io, such as the [`fnv`] crate.
|
/// There are many alternative [hashing algorithms available on crates.io].
|
||||||
///
|
///
|
||||||
/// It is required that the keys implement the [`Eq`] and [`Hash`] traits, although
|
/// It is required that the keys implement the [`Eq`] and [`Hash`] traits, although
|
||||||
/// this can frequently be achieved by using `#[derive(PartialEq, Eq, Hash)]`.
|
/// this can frequently be achieved by using `#[derive(PartialEq, Eq, Hash)]`.
|
||||||
@ -57,6 +57,7 @@ use crate::sys;
|
|||||||
/// The original C++ version of SwissTable can be found [here], and this
|
/// The original C++ version of SwissTable can be found [here], and this
|
||||||
/// [CppCon talk] gives an overview of how the algorithm works.
|
/// [CppCon talk] gives an overview of how the algorithm works.
|
||||||
///
|
///
|
||||||
|
/// [hashing algorithms available on crates.io]: https://crates.io/keywords/hasher
|
||||||
/// [SwissTable]: https://abseil.io/blog/20180927-swisstables
|
/// [SwissTable]: https://abseil.io/blog/20180927-swisstables
|
||||||
/// [here]: https://github.com/abseil/abseil-cpp/blob/master/absl/container/internal/raw_hash_set.h
|
/// [here]: https://github.com/abseil/abseil-cpp/blob/master/absl/container/internal/raw_hash_set.h
|
||||||
/// [CppCon talk]: https://www.youtube.com/watch?v=ncHmEUmJZf4
|
/// [CppCon talk]: https://www.youtube.com/watch?v=ncHmEUmJZf4
|
||||||
@ -154,7 +155,6 @@ use crate::sys;
|
|||||||
/// [`default`]: Default::default
|
/// [`default`]: Default::default
|
||||||
/// [`with_hasher`]: Self::with_hasher
|
/// [`with_hasher`]: Self::with_hasher
|
||||||
/// [`with_capacity_and_hasher`]: Self::with_capacity_and_hasher
|
/// [`with_capacity_and_hasher`]: Self::with_capacity_and_hasher
|
||||||
/// [`fnv`]: https://crates.io/crates/fnv
|
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use std::collections::HashMap;
|
/// use std::collections::HashMap;
|
||||||
|
Loading…
Reference in New Issue
Block a user