A std::hash::Hasher
which is designed to
work with already-hashed or hash-like data.
The provided hasher does minimal work under the assumption that the input data is already suitable
for use as a key in a HashSet
or HashMap
.
As well as the performance benefit, it also causes HashSet
s or HashMap
s to become somewhat
deterministic. Given two equal HashSet
s or HashMap
s containing more than a single element,
iterating them will yield the elements in differing orders. By using a
hash_hasher::HashedSet
or
hash_hasher::HashedMap
, then if
the same data is inserted and/or removed in the same order, iterating the collection will yield a
consistent order.
Since new()
and with_capacity()
aren't available for HashSet
s or HashMap
s using custom
hashers, the available constructors are default()
, with_hasher()
and
with_capacity_and_hasher()
.
extern crate hash_hasher;
use hash_hasher::{HashBuildHasher, HashedMap, HashedSet};
let mut map = HashedMap::default();
assert!(map.insert(0, "zero").is_none());
let mut set = HashedSet::with_capacity_and_hasher(100, HashBuildHasher::default());
assert!(set.insert(0));
A benchmark suite is included and sample figures can be found at the end of the nightly jobs of the AppVeyor results and the Travis results.
For example:
insert_sha1s_into_set_using_default_hasher ... bench: 1,171 ns/iter (+/- 30)
insert_sha1s_into_set_using_hash_hasher ... bench: 533 ns/iter (+/- 9)
insert_sha256s_into_set_using_default_hasher ... bench: 1,340 ns/iter (+/- 57)
insert_sha256s_into_set_using_hash_hasher ... bench: 546 ns/iter (+/- 11)
insert_sha512s_into_set_using_default_hasher ... bench: 1,804 ns/iter (+/- 2,597)
insert_sha512s_into_set_using_hash_hasher ... bench: 704 ns/iter (+/- 22)
insert_sip_hashes_into_set_using_default_hasher ... bench: 781 ns/iter (+/- 33)
insert_sip_hashes_into_set_using_hash_hasher ... bench: 256 ns/iter (+/- 50)
Licensed under either of
- Apache License, Version 2.0 (see also LICENSE-APACHE)
- MIT License (see also LICENSE-MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.