https://github.com/tommasobelluzzo/fasthashes
A .NET implementation of several non-cryptographic hashes.
https://github.com/tommasobelluzzo/fasthashes
fast-algorithms hash-functions hashing-algorithms hashing-library non-cryptographic-hash-functions testing-framework
Last synced: 3 months ago
JSON representation
A .NET implementation of several non-cryptographic hashes.
- Host: GitHub
- URL: https://github.com/tommasobelluzzo/fasthashes
- Owner: TommasoBelluzzo
- License: mit
- Created: 2018-10-21T22:20:56.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2025-01-01T01:23:55.000Z (about 1 year ago)
- Last Synced: 2025-09-11T10:48:13.219Z (5 months ago)
- Topics: fast-algorithms, hash-functions, hashing-algorithms, hashing-library, non-cryptographic-hash-functions, testing-framework
- Language: C#
- Homepage:
- Size: 927 KB
- Stars: 68
- Watchers: 5
- Forks: 11
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE.md
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# FastHashes
FashHashes is a suite of .NET non-cryptographic hash functions.
Status:
Info:
NuGet:
Donation:
## Main Features
* `High Performing`: deeply-optimized code makes extensive use of method inlining and unsafe memory pointers in order to speed up the computations.
* `Allocation Free`: all the internal functions follow a zero-allocation approach, only primitive types and/or arrays of primitive types are used by the algorithms.
* `Endian-Agnostic`: all the hashes provide consistent results regardless of the machine byte order, while only moderately affecting the overall performance of the computations.
* `Platform-Agnostic`: the code has been developed under `.NET Standard` framework and both `x86` and `x64` environments are fully supported.
* `Fully Managed`: since version `3.0.0`, pointers requiring unsafe memory access contexts have been completely removed and the library is now fully managed.
## Hashes
The library includes the following non-cryptographic hashes:
* `FarmHash`
* 32/64/128 Bits Output
* Fingerprint Versions
* Reference Implementation: [https://github.com/google/farmhash](https://github.com/google/farmhash)
* `FastHash`
* 32/64 Bits Output
* Reference Implementation: [https://github.com/ZilongTan/fast-hash](https://github.com/ZilongTan/fast-hash)
* `FastPositiveHash / TH1A`
* 64 Bits Output
* 0/1/2 Variants
* Reference Implementation: [https://github.com/leo-yuriev/t1ha](https://github.com/leo-yuriev/t1ha)
* `HalfSipHash`
* 32 Bits Output
* Reference Implementation: [https://github.com/veorq/SipHash](https://github.com/veorq/SipHash)
* `HighwayHash`
* 64/128/256 Bits Output
* Reference Implementation: [https://github.com/google/highwayhash](https://github.com/google/highwayhash)
* `KomiHash`
* 64 Bits Output
* Reference Implementation: [https://github.com/avaneev/komihash](https://github.com/avaneev/komihash)
* `MetroHash`
* 64/128 Bits Output
* 0/1 Variants
* Reference Implementation: [https://github.com/jandrewrogers/MetroHash](https://github.com/jandrewrogers/MetroHash)
* `MirHash`
* 64 Bits Output
* Reference Implementation: [https://github.com/vnmakarov/mir](https://github.com/vnmakarov/mir)
* `MumHash`
* 64 Bits Output
* Reference Implementation: [https://github.com/vnmakarov/mum-hash](https://github.com/vnmakarov/mum-hash)
* `MurmurHash`
* 32/64/128 Bits Output
* x86/x64 Variants
* Reference Implementation: [https://github.com/aappleby/smhasher](https://github.com/aappleby/smhasher)
* `Mx3Hash`
* 64 Bits Output
* Reference Implementation: [https://github.com/jonmaiga/mx3](https://github.com/jonmaiga/mx3)
* `PengyHash`
* 64 Bits Output
* Strict Variant
* Reference Implementation: [https://github.com/tinypeng/pengyhash](https://github.com/tinypeng/pengyhash)
* `SipHash`
* 64 Bits Output
* 1-3/2-4 Variants
* Reference Implementation: [https://github.com/veorq/SipHash](https://github.com/veorq/SipHash)
* `SpookyHash`
* 32/64/128 Bits Output
* Reference Implementation: [http://burtleburtle.net/bob/hash/spooky.html](http://burtleburtle.net/bob/hash/spooky.html)
* `WyHash`
* 32/64 Bits Output
* Strict Variant
* Reference Implementation: [https://github.com/wangyi-fudan/wyhash](https://github.com/wangyi-fudan/wyhash)
* `xxHash`
* 32/64 Bits Output
* Reference Implementation: [https://github.com/Cyan4973/xxHash](https://github.com/Cyan4973/xxHash)
## Requirements
The following `Frameworks` are supported:
* Library: `.NET Standard 2.0`, `.NET Standard 2.1`
* Auxiliary Projects: `.NET Core 2.1`, `.NET Core 3.1`, `.NET 5.0`, `.NET 6.0`
The following `NuGet` packages are required for performing unit tests:
* [Microsoft.NET.Test.Sdk](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk)
* [xunit](https://www.nuget.org/packages/xunit)
## Performance Benchmarks
| Hash Rank | Hash Name | Bulk Speed Test Average ↓ | Chunks Speed Test Average |
| :---: | :---: | :---: | :---: |
| *-* | *DummyHash (Reference)* | *609.34 GB/s* | *2.06 GB/s* |
| 1 | FarmHash64 | 11.47 GB/s | 626.60 MB/s |
| 2 | FarmHash128 | 11.27 GB/s | 641.03 MB/s |
| 3 | MetroHash128-V1 | 11.11 GB/s | 636.52 MB/s |
| 4 | MetroHash64-V1 | 11.10 GB/s | 628.81 MB/s |
| 5 | MetroHash128-V2 | 11.06 GB/s | 635.34 MB/s |
| 6 | MetroHash64-V2 | 11.05 GB/s | 620.92 MB/s |
| 7 | XxHash64 | 10.03 GB/s | 596.90 MB/s |
| 8 | Mx3Hash | 9.31 GB/s | 545.03 MB/s |
| 9 | PengyHash | 8.73 GB/s | 517.22 MB/s |
| 10 | MurmurHash128-x64 | 6.70 GB/s | 485.59 MB/s |
| 11 | MurmurHash64-x64 | 6.56 GB/s | 467.14 MB/s |
| 12 | XxHash32 | 6.43 GB/s | 482.92 MB/s |
| 13 | FastHash64 | 5.34 GB/s | 444.45 MB/s |
| 14 | FastHash32 | 5.26 GB/s | 440.91 MB/s |
| 15 | WyHash32 | 4.38 GB/s | 389.76 MB/s |
| 16 | FarmHash32 | 4.27 GB/s | 394.83 MB/s |
| 17 | FastPositiveHash-V1 | 4.10 GB/s | 386.51 MB/s |
| 18 | MurmurHash128-x86 | 4.05 GB/s | 383.60 MB/s |
| 19 | MurmurHash64-x86 | 4.01 GB/s | 374.73 MB/s |
| 20 | FastPositiveHash-V2 | 3.99 GB/s | 386.33 MB/s |
| 21 | MurmurHash32 | 2.82 GB/s | 332.35 MB/s |
| 22 | MumHash | 2.44 GB/s | 312.24 MB/s |
| 23 | WyHash64 | 2.39 GB/s | 340.13 MB/s |
| 24 | KomiHash | 2.31 GB/s | 331.88 MB/s |
| 25 | FastPositiveHash-V0 | 2.29 GB/s | 320.69 MB/s |
| 26 | MirHash | 2.03 GB/s | 298.14 MB/s |
| 27 | SipHash-13 | 1.28 GB/s | 230.67 MB/s |
| 28 | HighwayHash256 | 914.16 MB/s | 125.78 MB/s |
| 29 | HighwayHash64 | 899.65 MB/s | 151.54 MB/s |
| 30 | HighwayHash128 | 883.51 MB/s | 143.84 MB/s |
| 31 | SpookyHash32 | 752.43 MB/s | 156.79 MB/s |
| 32 | SpookyHash64 | 734.84 MB/s | 149.36 MB/s |
| 33 | SipHash-24 | 734.74 MB/s | 168.43 MB/s |
| 34 | SpookyHash128 | 723.91 MB/s | 155.67 MB/s |
| 35 | HalfSipHash | 364.78 MB/s | 119.96 MB/s |
The tests above have been conducted with the following machine setup:
* `CPU:` Intel Core i7-7700HQ @2.80GHz (4 Cores, 8 Threads, 256KB L1 Cache)
* `RAM:` 16 GB x DDR4 SO-DIMM @1200MHz
* `OS:` Microsoft Windows 10 64-Bit