Skip to content

Commit 4ce23f4

Browse files
authored
Fix XxHash3/XxHash128 DeriveSecretFromSeed scalar fallback on big endian (#79186)
Backport of #78084
1 parent 720ae03 commit 4ce23f4

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

src/libraries/System.IO.Hashing/src/System/IO/Hashing/XxHashShared.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -501,8 +501,8 @@ public static void DeriveSecretFromSeed(byte* destinationSecret, ulong seed)
501501
{
502502
for (int i = 0; i < SecretLengthBytes; i += sizeof(ulong) * 2)
503503
{
504-
Unsafe.WriteUnaligned(destinationSecret + i, Unsafe.ReadUnaligned<ulong>(defaultSecret + i) + seed);
505-
Unsafe.WriteUnaligned(destinationSecret + i + 8, Unsafe.ReadUnaligned<ulong>(defaultSecret + i + 8) - seed);
504+
WriteUInt64LE(destinationSecret + i, ReadUInt64LE(defaultSecret + i) + seed);
505+
WriteUInt64LE(destinationSecret + i + 8, ReadUInt64LE(defaultSecret + i + 8) - seed);
506506
}
507507
}
508508
}
@@ -791,6 +791,16 @@ public static ulong ReadUInt64LE(byte* data) =>
791791
Unsafe.ReadUnaligned<ulong>(data) :
792792
BinaryPrimitives.ReverseEndianness(Unsafe.ReadUnaligned<ulong>(data));
793793

794+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
795+
private static void WriteUInt64LE(byte* data, ulong value)
796+
{
797+
if (!BitConverter.IsLittleEndian)
798+
{
799+
value = BinaryPrimitives.ReverseEndianness(value);
800+
}
801+
Unsafe.WriteUnaligned(data, value);
802+
}
803+
794804
[StructLayout(LayoutKind.Auto)]
795805
public struct State
796806
{

0 commit comments

Comments
 (0)