Extremely fast non-cryptographic hash algorithm xxhash
xxHash is an Extremely fast Hash algorithm, running at RAM speed limits. It successfully completes the **SMHasher** test suite which evaluates collision, dispersion and randomness qualities of hash functions.
## Instalation
```
PM> Install-Package Standart.Hash.xxHash
```
## Benchmarks
This benchmark was launched on a **Windows 10 (10.0.16299.309)**. The reference system uses a **Intel Core i7-4700MQ CPU 2.40GHz (Haswell)**
| Method | x64 |
|---------------|----------:|
| Hash32 Array | 5.05 GB/s |
| Hash64 Array | 8.92 GB/s |
| Hash32 Span | 5.05 GB/s |
| Hash64 Span | 8.92 GB/s |
| Hash32 Stream | 3.22 GB/s |
| Hash64 Stream | 4.81 GB/s |
## Comparison between ะก# and C implementation
| Method | Platform | Language | 1KB Time | 1MB Time | 1GB Time | Speed | Difference |
|--------|---------:|---------:|----------:|----------:|----------:|----------:|-----------:|
| Hash32 | x64 | C# | 185.1 ns | 170.6 us | 193.6 ms | 5.16 GB/s | 1.4 % |
| Hash32 | x64 | C | 183.5 ns | 170.1 us | 190.8 ms | 5.24 GB/s | 1.4 % |
| Hash64 | x64 | C# | 117.3 ns | 87.1 us | 116.9 ms | 8.55 GB/s | 2.4 % |
| Hash64 | x64 | C | 104.8 ns | 85.3 us | 114.1 ms | 8.76 GB/s | 2.4 % |
## Api
```cs
public static uint ComputeHash(byte[] data, int length, uint seed = 0) { throw null; }
public static uint ComputeHash(Span data, int length, uint seed = 0) { throw null; }
public static uint ComputeHash(Stream stream, int bufferSize = 4096, uint seed = 0) { throw null; }
public static async ValueTask ComputeHashAsync(Stream stream, int bufferSize = 4096, uint seed = 0) { throw null; }
public static uint ComputeHash(string str, uint seed = 0) { throw null; }
public static ulong ComputeHash(byte[] data, int length, ulong seed = 0) { throw null; }
public static ulong ComputeHash(Span data, int length, ulong seed = 0) { throw null; }
public static ulong ComputeHash(Stream stream, int bufferSize = 8192, ulong seed = 0) { throw null; }
public static async ValueTask ComputeHashAsync(Stream stream, int bufferSize = 8192, ulong seed = 0) { throw null; }
public static ulong ComputeHash(string str, uint seed = 0) { throw null; }
public static uint128 ComputeHash(byte[] data, int length, uint seed = 0) { throw null; }
public static uint128 ComputeHash(Span data, int length, uint seed = 0) { throw null; }
public static uint128 ComputeHash(string str, uint seed = 0) { throw null; }
// allocations
public static byte[] ComputeHashBytes(byte[] data, int length, uint seed = 0) { throw null; }
public static byte[] ComputeHashBytes(Span data, int length, uint seed = 0) { throw null; }
public static byte[] ComputeHashBytes(string str, uint seed = 0) { throw null; }
```
## Examples
A few examples of how to use api
```cs
byte[] data = Encoding.UTF8.GetBytes("veni vidi vici");
ulong h64_1 = xxHash64.ComputeHash(data, data.Length);
ulong h64_2 = xxHash64.ComputeHash(new Span(data), data.Length);
ulong h64_3 = xxHash64.ComputeHash(new ReadOnlySpan(data), data.Length);
ulong h64_4 = xxHash64.ComputeHash(new MemoryStream(data));
ulong h64_5 = await xxHash64.ComputeHashAsync(new MemoryStream(data));
ulong h64_6 = xxHash64.ComputeHash("veni vidi vici");
uint h32_1 = xxHash32.ComputeHash(data, data.Length);
uint h32_2 = xxHash32.ComputeHash(new Span(data), data.Length);
uint h32_3 = xxHash32.ComputeHash(new ReadOnlySpan(data), data.Length);
uint h32_4 = xxHash32.ComputeHash(new MemoryStream(data));
uint h32_5 = await xxHash32.ComputeHashAsync(new MemoryStream(data));
uint h32_6 = xxHash32.ComputeHash("veni vidi vici");
uint128 h128_1 = xxHash128.ComputeHash(data, data.Length);
uint128 h128_2 = xxHash128.ComputeHash(new Span(data), data.Length);
uint128 h128_3 = xxHash128.ComputeHash(new ReadOnlySpan(data), data.Length);
uint128 h128_4 = xxHash128.ComputeHash("veni vidi vici");
Guid guid = h128_1.ToGuid();
byte[] bytes = h128_1.ToBytes();
byte[] hash_bytes_1 = xxHash128.ComputeHashBytes(data, data.Length);
byte[] hash_bytes_2 = xxHash128.ComputeHashBytes(new Span(data), data.Length);
byte[] hash_bytes_3 = xxHash128.ComputeHashBytes(new ReadOnlySpan(data), data.Length);
byte[] hash_bytes_4 = xxHash128.ComputeHashBytes("veni vidi vici");
```
---
Made in :beginner: Ukraine with :heart: