Add `SHA512Checksum` helper

This commit is contained in:
YoshiRulz 2025-05-15 16:21:31 +10:00
parent 9e3a8ff9c9
commit 9de825bac3
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
5 changed files with 62 additions and 0 deletions

View File

@ -6,6 +6,7 @@ namespace BizHawk.Common
/// <seealso cref="MD5Checksum"/>
/// <seealso cref="SHA1Checksum"/>
/// <seealso cref="SHA256Checksum"/>
/// <seealso cref="SHA512Checksum"/>
public static class CRC32Checksum
{
/// <remarks>in bits</remarks>

View File

@ -9,6 +9,7 @@ namespace BizHawk.Common
/// <seealso cref="CRC32Checksum"/>
/// <seealso cref="SHA1Checksum"/>
/// <seealso cref="SHA256Checksum"/>
/// <seealso cref="SHA512Checksum"/>
public static class MD5Checksum
{
/// <remarks>in bits</remarks>

View File

@ -11,6 +11,7 @@ namespace BizHawk.Common
/// <seealso cref="CRC32Checksum"/>
/// <seealso cref="MD5Checksum"/>
/// <seealso cref="SHA256Checksum"/>
/// <seealso cref="SHA512Checksum"/>
public static class SHA1Checksum
{
/// <remarks>in bits</remarks>

View File

@ -9,6 +9,7 @@ namespace BizHawk.Common
/// <seealso cref="CRC32Checksum"/>
/// <seealso cref="MD5Checksum"/>
/// <seealso cref="SHA1Checksum"/>
/// <seealso cref="SHA512Checksum"/>
public static class SHA256Checksum
{
/// <remarks>in bits</remarks>

View File

@ -0,0 +1,58 @@
using System.Diagnostics;
using System.Security.Cryptography;
using BizHawk.Common.BufferExtensions;
namespace BizHawk.Common
{
/// <summary>uses <see cref="SHA512"/> implementation from BCL</summary>
/// <seealso cref="CRC32Checksum"/>
/// <seealso cref="MD5Checksum"/>
/// <seealso cref="SHA1Checksum"/>
/// <seealso cref="SHA256Checksum"/>
public static class SHA512Checksum
{
/// <remarks>in bits</remarks>
internal const int EXPECTED_LENGTH = 512;
internal const string PREFIX = "SHA512";
#if NET7_0_OR_GREATER
public static byte[] Compute(ReadOnlySpan<byte> data)
=> SHA512.HashData(data);
#else
private static SHA512? _sha512Impl;
private static SHA512 SHA512Impl
{
get
{
if (_sha512Impl == null)
{
_sha512Impl = SHA512.Create();
Debug.Assert(_sha512Impl.CanReuseTransform && _sha512Impl.HashSize is EXPECTED_LENGTH, "nonstandard implementation?");
}
return _sha512Impl;
}
}
public static byte[] Compute(byte[] data)
=> SHA512Impl.ComputeHash(data);
public static string ComputeDigestHex(byte[] data)
=> Compute(data).BytesToHexString();
public static string ComputePrefixedHex(byte[] data)
=> $"{PREFIX}:{ComputeDigestHex(data)}";
public static byte[] Compute(ReadOnlySpan<byte> data)
=> Compute(data.ToArray());
#endif
public static string ComputeDigestHex(ReadOnlySpan<byte> data)
=> Compute(data).BytesToHexString();
public static string ComputePrefixedHex(ReadOnlySpan<byte> data)
=> $"{PREFIX}:{ComputeDigestHex(data)}";
}
}