-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Closed
Closed
Copy link
Labels
api-approvedAPI was approved in API review, it can be implementedAPI was approved in API review, it can be implementedarea-System.IO.Hashing
Milestone
Description
Background and motivation
System.IO.Hashing contains types for Crc32, Crc64, XxHash32, and XxHash64, and XxHash3 is being added. These types all have one-shot static methods for performing hashes over ReadOnlySpan<byte>, but all of these methods either allocate a resulting byte[] or write the result into a Span<byte>. However, the natural data types expecting in many use cases is just an int/uint for 32-bit or long/ulong for 64-bit hashes. We should add helpers for this.
API Proposal
namespace System.IO.Hashing;
public sealed class Crc32 : NonCryptographicHashAlgorithm
{
+ public static int HashToInt32(ReadOnlySpan<byte> source);
+ public int GetCurrentHashAsInt32();
...
}
public sealed class XxHash32 : NonCryptographicHashAlgorithm
{
+ public static int HashToInt32(ReadOnlySpan<byte> source, int seed = 0);
+ public int GetCurrentHashAsInt32();
...
}
public sealed class Crc64 : NonCryptographicHashAlgorithm
{
+ public static long HashToInt64(ReadOnlySpan<byte> source);
+ public long GetCurrentHashAsInt64();
...
}
public sealed class XxHash64 : NonCryptographicHashAlgorithm
{
+ public static long HashToInt64(ReadOnlySpan<byte> source, long seed = 0);
+ public long GetCurrentHashAsInt64();
...
}
public sealed class XxHash3 : NonCryptographicHashAlgorithm
{
+ public static long HashToInt64(ReadOnlySpan<byte> source, long seed = 0);
+ public long GetCurrentHashAsInt64();
...
}
public sealed class XxHash128 : NonCryptographicHashAlgorithm // assuming https://github.com/dotnet/runtime/issues/77885
{
+ public static Int128 HashToInt128(ReadOnlySpan<byte> source, long seed = 0);
+ public Int128 GetCurrentHashAsInt128();
...
}- All of these implementations already compute the relevant int/long and then write it to either a newly-allocated array or the destination span. We'd just return it instead from the new method.
- The existing methods write the value to the destination as big-endian. The int/long-returning methods would simply return the value in machine-endianness.
- Should we use unsigned types instead? All of the algorithms internally operate in unsigned land.
API Usage
ReadOnlySpan<byte> data = ...;
int hash = XxHash32.HashToInt32(data);Alternative Designs
No response
Risks
No response
LeaFrock, huoyaoyuan, PaulusParssinen, lilinus, Gnbrkm41 and 3 more
Metadata
Metadata
Assignees
Labels
api-approvedAPI was approved in API review, it can be implementedAPI was approved in API review, it can be implementedarea-System.IO.Hashing