SauceControl.Blake2Fast
2.0.0
Install-Package SauceControl.Blake2Fast -Version 2.0.0
dotnet add package SauceControl.Blake2Fast --version 2.0.0
<PackageReference Include="SauceControl.Blake2Fast" Version="2.0.0" />
paket add SauceControl.Blake2Fast --version 2.0.0
#r "nuget: SauceControl.Blake2Fast, 2.0.0"
// Install SauceControl.Blake2Fast as a Cake Addin
#addin nuget:?package=SauceControl.Blake2Fast&version=2.0.0
// Install SauceControl.Blake2Fast as a Cake Tool
#tool nuget:?package=SauceControl.Blake2Fast&version=2.0.0
These RFC 7693-compliant BLAKE2 implementations have been tuned for high speed and low memory usage. The .NET Core builds use the new x86 SIMD Intrinsics for even greater speed. Span{byte}
is used throughout for lower memory overhead compared to byte[]
based APIs.
On .NET Core 2.1+, Blake2Fast includes SSE4.1 SIMD-accelerated implementations of both BLAKE2b and BLAKE2s.
On .NET Core 3+, a faster AVX2 implementation of BLAKE2b is included in addition to the SSE4.1 implementation.
Usage
All-at-Once Hashing
The simplest and lightest-weight way to calculate a hash is the all-at-once ComputeHash
method.
var hash = Blake2b.ComputeHash(data);
BLAKE2 supports variable digest lengths from 1 to 32 bytes for BLAKE2s or 1 to 64 bytes for BLAKE2b.
var hash = Blake2b.ComputeHash(42, data);
BLAKE2 also natively supports keyed hashing.
var hash = Blake2b.ComputeHash(key, data);
Incremental Hashing
BLAKE2 hashes can be incrementally updated if you do not have the data available all at once.
async Task<byte[]> ComputeHashAsync(Stream data)
{
var hasher = Blake2b.CreateIncrementalHasher();
var buffer = ArrayPool<byte>.Shared.Rent(4096);
int bytesRead;
while ((bytesRead = await data.ReadAsync(buffer, 0, buffer.Length)) > 0)
hasher.Update(new Span<byte>(buffer, 0, bytesRead));
ArrayPool<byte>.Shared.Return(buffer);
return hasher.Finish();
}
Allocation-Free Hashing
The output hash digest can be written to an existing buffer to avoid allocating a new array each time.
Span<byte> buffer = stackalloc byte[Blake2b.DefaultDigestLength];
Blake2b.ComputeAndWriteHash(data, buffer);
This is especially useful when performing an iterative hash, as might be used in a key derivation function.
byte[] DeriveBytes(string password, ReadOnlySpan<byte> salt)
{
// Create key from password, then hash the salt using the key
var pwkey = Blake2b.ComputeHash(Encoding.UTF8.GetBytes(password));
var hbuff = Blake2b.ComputeHash(pwkey, salt);
// Hash the hash lots of times, re-using the same buffer
for (int i = 0; i < 999_999; i++)
Blake2b.ComputeAndWriteHash(pwkey, hbuff, hbuff);
return hbuff;
}
System.Security.Cryptography Interop
For interoperating with code that uses System.Security.Cryptography
primitives, Blake2Fast can create a HashAlgorithm
wrapper. The wrapper inherits from HMAC
in case keyed hashing is required.
HashAlgorithm
is less efficient than the above methods, so use it only when necessary for compatibility.
byte[] WriteDataAndCalculateHash(byte[] data, string outFile)
{
using (var hashAlg = Blake2b.CreateHashAlgorithm())
using (var fileStream = new FileStream(outFile, FileMode.Create))
using (var cryptoStream = new CryptoStream(fileStream, hashAlg, CryptoStreamMode.Write))
{
cryptoStream.Write(data, 0, data.Length);
cryptoStream.FlushFinalBlock();
return hashAlg.Hash;
}
}
Product | Versions |
---|---|
.NET | net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows |
.NET Core | netcoreapp1.0 netcoreapp1.1 netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1 |
.NET Standard | netstandard1.1 netstandard1.2 netstandard1.3 netstandard1.4 netstandard1.5 netstandard1.6 netstandard2.0 netstandard2.1 |
.NET Framework | net45 net451 net452 net46 net461 net462 net463 net47 net471 net472 net48 |
MonoAndroid | monoandroid |
MonoMac | monomac |
MonoTouch | monotouch |
Tizen | tizen30 tizen40 tizen60 |
Universal Windows Platform | uap uap10.0 |
Windows Phone | wpa81 |
Windows Store | netcore netcore45 netcore451 |
Xamarin.iOS | xamarinios |
Xamarin.Mac | xamarinmac |
Xamarin.TVOS | xamarintvos |
Xamarin.WatchOS | xamarinwatchos |
-
.NETCoreApp 2.1
- System.Runtime.CompilerServices.Unsafe (>= 4.7.1)
- System.Runtime.Intrinsics.Experimental (>= 4.5.0-rc1)
-
.NETCoreApp 3.0
- No dependencies.
-
.NETFramework 4.5
- System.Buffers (>= 4.5.1)
- System.Memory (>= 4.5.4)
- System.Runtime.CompilerServices.Unsafe (>= 4.5.3)
-
.NETStandard 1.1
- NETStandard.Library (>= 1.6.1)
- System.Buffers (>= 4.5.1)
- System.Memory (>= 4.5.4)
- System.Runtime.CompilerServices.Unsafe (>= 4.5.3)
-
.NETStandard 1.3
- NETStandard.Library (>= 1.6.1)
- System.Buffers (>= 4.5.1)
- System.Memory (>= 4.5.4)
- System.Runtime.CompilerServices.Unsafe (>= 4.5.3)
-
.NETStandard 2.0
- System.Buffers (>= 4.5.1)
- System.Memory (>= 4.5.4)
- System.Runtime.CompilerServices.Unsafe (>= 4.5.3)
-
.NETStandard 2.1
- System.Runtime.CompilerServices.Unsafe (>= 4.7.1)
NuGet packages (4)
Showing the top 4 NuGet packages that depend on SauceControl.Blake2Fast:
Package | Downloads |
---|---|
CardanoSharp.Wallet
Package Description |
|
DigitalRuby.SimpleCache
Simple and powerful caching for .NET using three layers: RAM, file and redis. |
|
Centr.NetCS
Third Party Library for implementing Credits Blockchain in .NET |
|
PoseidonSharp
This is a Poseidon Hashing Library built for use with Loopring |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on SauceControl.Blake2Fast:
Repository | Stars |
---|---|
baking-bad/tzkt
😼 Awesome Tezos blockchain indexer and API
|
See https://github.com/saucecontrol/Blake2Fast/releases for release-specific notes.