• Home
  • History
  • Annotate
Name
Date
Size
#Lines
LOC

..--

patches/25-Apr-2025-9382

src/25-Apr-2025-3,8842,840

tests/25-Apr-2025-593529

.cargo-checksum.jsonD25-Apr-20251.7 KiB11

Android.bpD25-Apr-20251.2 KiB5349

Cargo.tomlD25-Apr-20253 KiB168139

FAQ.mdD25-Apr-20259 KiB11988

LICENSED25-Apr-202510.6 KiB202169

LICENSE-APACHED25-Apr-202510.6 KiB202169

LICENSE-MITD25-Apr-20251 KiB2622

METADATAD25-Apr-2025398 1817

MODULE_LICENSE_APACHE2D25-Apr-20250

README.mdD25-Apr-20255.7 KiB11069

TEST_MAPPINGD25-Apr-2025302 1716

build.rsD25-Apr-2025691 2118

cargo_embargo.jsonD25-Apr-2025112 98

rustfmt.tomlD25-Apr-202516 21

README.md

1# aHash     ![Build Status](https://img.shields.io/github/actions/workflow/status/tkaitchuck/aHash/rust.yml?branch=master) ![Licence](https://img.shields.io/crates/l/ahash) ![Downloads](https://img.shields.io/crates/d/ahash)
2
3AHash is the [fastest](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md#Speed),
4[DOS resistant hash](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks) currently available in Rust.
5AHash is intended *exclusively* for use in in-memory hashmaps.
6
7AHash's output is of [high quality](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md#Quality) but aHash is **not** a cryptographically secure hash.
8
9## Design
10
11Because AHash is a keyed hash, each map will produce completely different hashes, which cannot be predicted without knowing the keys.
12[This prevents DOS attacks where an attacker sends a large number of items whose hashes collide that get used as keys in a hashmap.](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks)
13
14This also avoids [accidentally quadratic behavior by reading from one map and writing to another.](https://accidentallyquadratic.tumblr.com/post/153545455987/rust-hash-iteration-reinsertion)
15
16## Goals and Non-Goals
17
18AHash does *not* have a fixed standard for its output. This allows it to improve over time. For example,
19if any faster algorithm is found, aHash will be updated to incorporate the technique.
20Similarly, should any flaw in aHash's DOS resistance be found, aHash will be changed to correct the flaw.
21
22Because it does not have a fixed standard, different computers or computers on different versions of the code will observe different hash values.
23As such, aHash is not recommended for use other than in-memory maps. Specifically, aHash is not intended for network use or in applications which persist hashed values.
24(In these cases `HighwayHash` would be a better choice)
25
26Additionally, aHash is not intended to be cryptographically secure and should not be used as a MAC, or anywhere which requires a cryptographically secure hash.
27(In these cases `SHA-3` would be a better choice)
28
29## Usage
30
31AHash is a drop in replacement for the default implementation of the `Hasher` trait. To construct a `HashMap` using aHash
32as its hasher do the following:
33
34```rust
35use ahash::{AHasher, RandomState};
36use std::collections::HashMap;
37
38let mut map: HashMap<i32, i32, RandomState> = HashMap::default();
39map.insert(12, 34);
40```
41For convenience, wrappers called `AHashMap` and `AHashSet` are also provided.
42These do the same thing with slightly less typing.
43```rust
44use ahash::AHashMap;
45
46let mut map: AHashMap<i32, i32> = AHashMap::new();
47map.insert(12, 34);
48map.insert(56, 78);
49```
50
51## Flags
52
53The aHash package has the following flags:
54* `std`: This enables features which require the standard library. (On by default) This includes providing the utility classes `AHashMap` and `AHashSet`.
55* `serde`: Enables `serde` support for the utility classes `AHashMap` and `AHashSet`.
56* `runtime-rng`: To obtain a seed for Hashers will obtain randomness from the operating system. (On by default)
57This is done using the [getrandom](https://github.com/rust-random/getrandom) crate.
58* `compile-time-rng`: For OS targets without access to a random number generator, `compile-time-rng` provides an alternative.
59If `getrandom` is unavailable and `compile-time-rng` is enabled, aHash will generate random numbers at compile time and embed them in the binary.
60* `nightly-arm-aes`: To use AES instructions on 32-bit ARM, which requires nightly. This is not needed on AArch64.
61This allows for DOS resistance even if there is no random number generator available at runtime (assuming the compiled binary is not public).
62This makes the binary non-deterministic. (If non-determinism is a problem see [constrandom's documentation](https://github.com/tkaitchuck/constrandom#deterministic-builds))
63
64If both `runtime-rng` and `compile-time-rng` are enabled the `runtime-rng` will take precedence and `compile-time-rng` will do nothing.
65If neither flag is set, seeds can be supplied by the application. [Multiple apis](https://docs.rs/ahash/latest/ahash/random_state/struct.RandomState.html)
66are available to do this.
67
68## Comparison with other hashers
69
70A full comparison with other hashing algorithms can be found [here](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md)
71
72![Hasher performance](https://docs.google.com/spreadsheets/d/e/2PACX-1vSK7Li2nS-Bur9arAYF9IfT37MP-ohAe1v19lZu5fd9MajI1fSveLAQZyEie4Ea9k5-SWHTff7nL2DW/pubchart?oid=1323618938&format=image)
73
74For a more representative performance comparison which includes the overhead of using a HashMap, see [HashBrown's benchmarks](https://github.com/rust-lang/hashbrown#performance)
75as HashBrown now uses aHash as its hasher by default.
76
77## Hash quality
78
79AHash passes the full [SMHasher test suite](https://github.com/rurban/smhasher).
80
81The code to reproduce the result, and the full output [are checked into the repo](https://github.com/tkaitchuck/aHash/tree/master/smhasher).
82
83## Additional FAQ
84
85A separate FAQ document is maintained [here](https://github.com/tkaitchuck/aHash/blob/master/FAQ.md).
86If you have questions not covered there, open an issue [here](https://github.com/tkaitchuck/aHash/issues).
87
88## License
89
90Licensed under either of:
91
92 * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
93 * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
94
95at your option.
96
97## Contribution
98
99Unless you explicitly state otherwise, any contribution intentionally submitted
100for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
101additional terms or conditions.
102
103
104
105
106
107
108
109
110