- API supports ReadOnlySpan for optimal performance and flexibility
- Unsafe API that takes byte* as input. Use this when performance is important.
- Most of the hashes are verified with test vectors from the original author
- High-performance zero-allocation implementations
- Index variants of each hash function that give the same output as if using the hash function, but takes in a 32bit/64bit integer.
These hash functions are included in the library.
| Name | Version | Authors | License |
|---|---|---|---|
| AbslHash | - | The Abseil Authors | Apache 2.0 |
| AesniHash | ae11846 |
Ruan Kunliang | BSD 3-Clause |
| CityHash | 1.1.1 (4726e30) |
Geoff Pike, Jyrki Alakuijala | MIT |
| CLHash | 1.0.0 (fd0331c) |
Daniel Lemire, Owen Kaser | Apache 2.0 |
| DJBHash | - | Daniel J. Bernstein | Public domain |
| FarmHash | 1.1.0 (0d859a8) |
Geoff Pike | MIT |
| FarshHash | 0.2.0 (d74ef3a) |
Bulat Ziganshin | MIT |
| FNVHash | - | Glenn Fowler, Landon Curt Noll, Kiem-Phong Vo | Public domain |
| FoldHash | 0.2.0 (8f878c6) |
Orson Peters | Zlib |
| Gx2Hash | 3.5.0 (6438a7b) |
Orso G. | MIT |
| HighwayHash | - | Jyrki Alakuijala, Bill Cox, Jan Wassenberg | Apache 2.0 |
| MarvinHash | 4017327 |
Niels Ferguson, Reid Borsuk, Jeffrey Cooperstein, Matthew Ellis | MIT |
| MeowHash | 0.5/calico (b080caa) |
Molly Rocket, Inc. | Zlib |
| MurmurHash | 3.0.0 (92cf370) |
Austin Appleby | Public domain |
| PolymurHash | 2.0.0 (c6cc688) |
Orson Peters | Zlib |
| PolyXorHash | 0.1.0 (3123eb6) |
Orson Peters | Zlib |
| RapidHash | 3.0.0 (bc4b4ba) |
Nicolas De Carli | MIT |
| SipHash | 1.0.0 (dfaa38e) |
Jean-Philippe Aumasson, Daniel J. Bernstein | MIT |
| SuperFastHash | - | Paul Hsieh | Paul Hsieh derivative |
| T1ha2Hash | 2.1.1 (0db5d6b) |
Positive Technologies, Leonid Yuriev | Zlib |
| WyHash | final 2 (59aacba), final 3 (991aa3d), 4.3.0 (2ac9a50) |
Wang Yi | Unlicense |
| xxHash | 0.8.3 (e626a72) |
Yann Collet | BSD 2-Clause |
FastHash is licensed under the MIT license.
The hash functions are ports of the projects listed above and remain subject to their original licenses. The license column shows the license FastHash uses where upstream offers a choice. See THIRD-PARTY-NOTICES.txt for the full notices.
The table below gives an overview of the implementations.
| Name | Managed | Unsafe | 32bit | 64bit | 128bit | Index | Seeded | Secret | Verified |
|---|---|---|---|---|---|---|---|---|---|
| AbslHash | x | x | x | x | x | ||||
| AesniHash | x | x | x | x | x | ||||
| CityHash | x | x | x | x | x | x | x | x | |
| CLHash | x | x | x | x | x | x | |||
| DJBHash | x | x | x | x | x | ||||
| FarmHash | x | x | x | x | x | x | x | x | |
| FarshHash | x | x | x | x | x | x | x | ||
| FNVHash | x | x | x | x | x | ||||
| FoldHash | x | x | x | x | x | ||||
| Gx2Hash | x | x | x | x | x | x | |||
| HighwayHash | x | x | x | x | x | x | x | ||
| MarvinHash | x | x | x | x | x | ||||
| MeowHash | x | x | x | x | |||||
| MurmurHash | x | x | x | x | x | x | - | ||
| PolymurHash | x | x | x | x | |||||
| PolyXorHash | x | x | x | x | x | x | x | ||
| RapidHash | x | x | x | x | x | ||||
| SipHash | x | x | x | x | x | x | x | ||
| SuperFastHash | x | x | x | x | x | ||||
| T1ha2Hash | x | x | x | x | x | ||||
| WyHash2 | x | x | x | x | x | x | x | ||
| WyHash3 | x | x | x | x | x | x | x | ||
| WyHash4 | x | x | x | x | x | x | x | ||
| xxHash | x | x | x | x | x | x | x | ||
| xxHash3 | x | x | x | x | x | x | x |
- Managed: Fully managed C# implementation.
- Unsafe: Pointer-based implementation.
- Bits: Output widths exposed by the implementation.
- Index: Hashes a 32-bit or 64-bit integer directly.
- Seeded: Accepts an input seed to vary hash results.
- Secret: Accepts caller-provided key material.
- Verified: Tested against vectors supplied by the original author. A '-' means vectors exist but are not yet included.
- WYHASH_CONDOM: Define this compilation symbol when building from source to select upstream mode 2 (blind multiplication). Default builds use upstream mode 1.
Measured on 32 KiB data. The unsafe versions are implemented using C# unsafe code.
Note: Speed is not everything. The quality of a hash is just as important, but much more difficult to measure. See SMHasher for more details on hash quality.
| Method | Mean | Error | StdDev | MiB/s |
|---|---|---|---|---|
| Gx2Hash32 | 273.3 ns | 2.00 ns | 1.32 ns | 114,346 |
| Gx2Hash128 | 273.8 ns | 2.78 ns | 1.84 ns | 114,123 |
| Gx2Hash64 | 274.4 ns | 5.37 ns | 3.88 ns | 113,885 |
| MeowHash128Unsafe | 530.1 ns | 0.37 ns | 0.19 ns | 58,953 |
| MeowHash64Unsafe | 531.5 ns | 2.39 ns | 1.58 ns | 58,799 |
| FoldHashQuality64 | 785.1 ns | 0.95 ns | 0.50 ns | 39,805 |
| FoldHash64 | 787.6 ns | 3.62 ns | 2.39 ns | 39,680 |
| Wy2Hash64Unsafe | 888.4 ns | 2.24 ns | 1.48 ns | 35,176 |
| AesniHash64 | 956.9 ns | 9.70 ns | 6.41 ns | 32,656 |
| AesniHash128 | 957.9 ns | 10.05 ns | 5.98 ns | 32,624 |
| Rapid3HashMicro64 | 1,023.7 ns | 3.61 ns | 2.39 ns | 30,527 |
| Rapid3HashNano64 | 1,027.4 ns | 2.32 ns | 1.22 ns | 30,415 |
| Rapid3Hash64 | 1,034.5 ns | 15.90 ns | 9.46 ns | 30,208 |
| Wy2Hash64 | 1,113.5 ns | 7.36 ns | 4.38 ns | 28,065 |
| FarmHash64Unsafe | 1,264.9 ns | 2.77 ns | 1.65 ns | 24,706 |
| FarmHash64 | 1,265.0 ns | 1.02 ns | 0.53 ns | 24,704 |
| CityHash128 | 1,554.8 ns | 5.24 ns | 2.74 ns | 20,099 |
| CityHash128Unsafe | 1,560.2 ns | 8.06 ns | 5.33 ns | 20,029 |
| CityHash64Unsafe | 1,573.0 ns | 1.81 ns | 1.08 ns | 19,866 |
| CityHash64 | 1,622.3 ns | 31.70 ns | 32.56 ns | 19,262 |
| XxHash64Unsafe | 1,697.1 ns | 13.65 ns | 9.03 ns | 18,414 |
| XxHash64 | 1,718.7 ns | 33.71 ns | 26.32 ns | 18,182 |
| FarshHash64Unsafe | 2,370.7 ns | 23.88 ns | 15.79 ns | 13,182 |
| FarshHash64 | 2,927.0 ns | 21.70 ns | 12.91 ns | 10,677 |
| XxHash32Unsafe | 3,392.1 ns | 26.25 ns | 15.62 ns | 9,212 |
| XxHash32 | 3,395.9 ns | 29.93 ns | 19.80 ns | 9,202 |
| Murmur3Hash128Unsafe | 3,713.3 ns | 2.30 ns | 1.37 ns | 8,416 |
| Murmur3Hash128 | 3,804.6 ns | 14.37 ns | 9.51 ns | 8,214 |
| CityHash32Unsafe | 3,917.9 ns | 10.12 ns | 6.02 ns | 7,976 |
| FarmHash32 | 3,942.2 ns | 10.61 ns | 7.01 ns | 7,927 |
| CityHash32 | 3,956.8 ns | 16.46 ns | 9.80 ns | 7,898 |
| FarmHash32Unsafe | 3,964.4 ns | 42.80 ns | 25.47 ns | 7,883 |
| Xx3Hash64Unsafe | 4,109.6 ns | 16.47 ns | 9.80 ns | 7,604 |
| Xx3Hash128Unsafe | 4,112.9 ns | 25.21 ns | 13.19 ns | 7,598 |
| Polymur2Hash64 | 4,159.1 ns | 8.17 ns | 4.86 ns | 7,514 |
| MarvinHash64 | 8,552.2 ns | 38.51 ns | 25.47 ns | 3,654 |
| MarvinHash32 | 8,586.4 ns | 60.45 ns | 39.98 ns | 3,639 |
| Murmur3Hash32Unsafe | 8,808.0 ns | 8.33 ns | 4.96 ns | 3,548 |
| Murmur3Hash32 | 8,822.5 ns | 15.04 ns | 7.87 ns | 3,542 |
| SuperFastHash32Unsafe | 10,088.7 ns | 25.39 ns | 15.11 ns | 3,098 |
| SuperFastHash32 | 10,092.9 ns | 27.41 ns | 18.13 ns | 3,096 |
| SipHash64 | 10,201.6 ns | 41.62 ns | 21.77 ns | 3,063 |
| SipHash64Unsafe | 10,377.6 ns | 2.38 ns | 1.25 ns | 3,011 |
| Djb2Hash32Unsafe | 20,187.0 ns | 8.72 ns | 4.56 ns | 1,548 |
| Djb2Hash64 | 20,187.2 ns | 19.96 ns | 13.20 ns | 1,548 |
| Djb2Hash32 | 20,195.8 ns | 33.28 ns | 22.01 ns | 1,547 |
| Djb2Hash64Unsafe | 20,197.7 ns | 26.61 ns | 15.84 ns | 1,547 |
| Fnv1aHash32 | 26,892.0 ns | 22.45 ns | 14.85 ns | 1,162 |
| Fnv1aHash32Unsafe | 26,893.7 ns | 20.96 ns | 10.96 ns | 1,162 |
| Fnv1aHash64 | 26,918.9 ns | 55.92 ns | 33.27 ns | 1,161 |
| Fnv1aHash64Unsafe | 27,149.7 ns | 247.35 ns | 147.20 ns | 1,151 |
| Method | Mean | Error | StdDev |
|---|---|---|---|
| Gx2Hash64 | 0.0796 ns | 0.0198 ns | 0.0175 ns |
| Fnv1aHash32 | 0.1131 ns | 0.0102 ns | 0.0068 ns |
| XxHash32 | 0.1249 ns | 0.0141 ns | 0.0093 ns |
| FarmHash64 | 0.1299 ns | 0.0069 ns | 0.0041 ns |
| FoldHash64 | 0.1302 ns | 0.0157 ns | 0.0104 ns |
| AesniHash64 | 0.1352 ns | 0.0083 ns | 0.0055 ns |
| Murmur3Hash32 | 0.1373 ns | 0.0267 ns | 0.0209 ns |
| Djb2Hash32 | 0.1886 ns | 0.0065 ns | 0.0034 ns |
| Gx2Hash32 | 0.1997 ns | 0.0149 ns | 0.0078 ns |
| CityHash64 | 0.3420 ns | 0.0210 ns | 0.0125 ns |
| Wy2Hash64 | 0.3537 ns | 0.0048 ns | 0.0029 ns |
| Xx3Hash64 | 0.3700 ns | 0.0167 ns | 0.0099 ns |
| SuperFastHash32 | 0.3980 ns | 0.0073 ns | 0.0044 ns |
| FoldHashQuality64 | 0.4183 ns | 0.0319 ns | 0.0231 ns |
| Rapid3HashNano64 | 0.4331 ns | 0.0283 ns | 0.0221 ns |
| Rapid3HashMicro64 | 0.4446 ns | 0.0278 ns | 0.0184 ns |
| XxHash64 | 0.4563 ns | 0.0137 ns | 0.0091 ns |
| Rapid3Hash64 | 0.4869 ns | 0.0556 ns | 0.0617 ns |
| MarvinHash32 | 0.6195 ns | 0.0053 ns | 0.0032 ns |
| FarshHash64 | 0.8928 ns | 0.0050 ns | 0.0033 ns |
| Fnv1aHash64 | 1.2018 ns | 0.0386 ns | 0.0230 ns |
| Djb2Hash64 | 1.3681 ns | 0.0443 ns | 0.0293 ns |
| MarvinHash64 | 1.3807 ns | 0.0078 ns | 0.0047 ns |
| FarmHash32 | 1.4742 ns | 0.0076 ns | 0.0040 ns |
| CityHash32 | 1.5003 ns | 0.0066 ns | 0.0040 ns |
| Polymur2Hash64 | 1.8500 ns | 0.0177 ns | 0.0093 ns |
| SipHash64 | 7.0921 ns | 0.0919 ns | 0.0608 ns |
| MeowHash64Unsafe | 39.4472 ns | 0.7643 ns | 0.6382 ns |
| HighwayHash64Unsafe | 81.4736 ns | 1.5304 ns | 1.4315 ns |
| Method | spec | Mean | Error | StdDev |
|---|---|---|---|---|
| Mix64 | JM_xmrx_Depth12_64 | 1.136 ns | 0.0187 ns | 0.0111 ns |
| Mix64 | DS_xmxmx_Mix01_64 | 1.159 ns | 0.0104 ns | 0.0062 ns |
| Mix64 | YC_xmx_XXH3_64 | 1.167 ns | 0.0177 ns | 0.0105 ns |
| Mix64 | DS_xmxmx_Mix09_64 | 1.168 ns | 0.0115 ns | 0.0076 ns |
| Mix64 | DS_xmxmx_Mix11_64 | 1.169 ns | 0.0023 ns | 0.0014 ns |
| Mix64 | DS_xmxmx_Mix05_64 | 1.172 ns | 0.0252 ns | 0.0150 ns |
| Mix64 | EZ_xmx_FastHash_64 | 1.172 ns | 0.0130 ns | 0.0086 ns |
| Mix64 | JM_mxrmx_Depth14_64 | 1.179 ns | 0.0191 ns | 0.0126 ns |
| Mix64 | JM_mrm_Depth7_64 | 1.180 ns | 0.0151 ns | 0.0100 ns |
| Mix64 | JM_xmx_Depth9_64 | 1.183 ns | 0.0357 ns | 0.0236 ns |
| Mix64 | JM_mxm_Depth8_64 | 1.184 ns | 0.0136 ns | 0.0090 ns |
| Mix64 | PE_xmxmx_Moremur_64 | 1.205 ns | 0.0335 ns | 0.0222 ns |
| Mix64 | JM_xmxmx_Mx2_64 | 1.351 ns | 0.0121 ns | 0.0072 ns |
| Mix64 | JM_mxmx_Depth11_64 | 1.357 ns | 0.0105 ns | 0.0063 ns |
| Mix64 | DL_xmxmx_Lea_64 | 1.369 ns | 0.0059 ns | 0.0035 ns |
| Mix64 | PE_rrxrrxmxxmxx_Nasam_64 | 1.372 ns | 0.0165 ns | 0.0109 ns |
| Mix64 | DS_xmxmx_Mix12_64 | 1.375 ns | 0.0288 ns | 0.0190 ns |
| Mix64 | JM_mxmxmx_Depth15_64 | 1.376 ns | 0.0347 ns | 0.0230 ns |
| Mix64 | DE_xmxmx_Degski_64 | 1.378 ns | 0.0265 ns | 0.0175 ns |
| Mix64 | TE_rlxrlmrlxrlx_AxMix_64 | 1.379 ns | 0.0106 ns | 0.0070 ns |
| Mix64 | AA_xmxmx_Murmur_64 | 1.382 ns | 0.0280 ns | 0.0185 ns |
| Mix64 | DS_xmxmx_Mix03_64 | 1.385 ns | 0.0203 ns | 0.0106 ns |
| Mix64 | WF_amxmx_Wymix_64 | 1.386 ns | 0.0141 ns | 0.0093 ns |
| Mix64 | DS_xmxmx_Mix08_64 | 1.387 ns | 0.0184 ns | 0.0121 ns |
| Mix64 | WF_amx_Wymix_64 | 1.389 ns | 0.0204 ns | 0.0135 ns |
| Mix64 | DS_xmxmx_Mix10_64 | 1.389 ns | 0.0324 ns | 0.0234 ns |
| Mix64 | DS_xmxmx_Mix02_64 | 1.390 ns | 0.0483 ns | 0.0377 ns |
| Mix64 | PE_rrxrrxmxmx_rrmxmx_64 | 1.391 ns | 0.0219 ns | 0.0145 ns |
| Mix64 | DS_xmxmx_Mix07_64 | 1.392 ns | 0.0329 ns | 0.0196 ns |
| Mix64 | PK_rlxrlx_Umash_64 | 1.392 ns | 0.0194 ns | 0.0128 ns |
| Mix64 | DS_xmxmx_Mix04_64 | 1.394 ns | 0.0207 ns | 0.0137 ns |
| Mix64 | PE_rrxrrmrrxrrxmx_rrxmrrxmsx0_64 | 1.396 ns | 0.0445 ns | 0.0295 ns |
| Mix64 | JM_mxma_Depth11_64 | 1.399 ns | 0.0296 ns | 0.0196 ns |
| Mix64 | JM_mxmxm_Depth13_64 | 1.411 ns | 0.0425 ns | 0.0253 ns |
| Mix64 | DS_xmxmx_Mix14_64 | 1.413 ns | 0.0507 ns | 0.0335 ns |
| Mix64 | YC_xmxmx_XXH_64 | 1.415 ns | 0.0331 ns | 0.0219 ns |
| Mix64 | DS_xmxmx_Mix06_64 | 1.425 ns | 0.0382 ns | 0.0227 ns |
| Mix64 | DS_xmxmx_Mix13_64 | 1.454 ns | 0.0522 ns | 0.0580 ns |
| Mix64 | JM_xmxmxmx_Mx3_64 | 1.569 ns | 0.0120 ns | 0.0063 ns |
| Mix64 | GP_mxxmxxm_CityHash_64 | 1.591 ns | 0.0262 ns | 0.0174 ns |
| Mix32 | CW_xmxmxmx_Triple_32 | 1.947 ns | 0.0484 ns | 0.0320 ns |
| Mix32 | AA_xmxmx_Murmur_32 | 2.045 ns | 0.0407 ns | 0.0242 ns |
| Mix32 | DE_xmxmx_Degski_32 | 2.203 ns | 0.0160 ns | 0.0095 ns |
| Mix32 | YC_xmxmx_XXH_32 | 2.222 ns | 0.0138 ns | 0.0092 ns |
| Mix32 | FP_xsxxmx_Fp64_32 | 2.234 ns | 0.0140 ns | 0.0093 ns |
| Mix32 | CW_xmxmx_LowBias_32 | 2.255 ns | 0.0656 ns | 0.0702 ns |