<PackageReference Include="System.ClientModel" Version="1.7.0" />

JsonPathComparer

using System.Collections.Generic; using System.Runtime.CompilerServices; namespace System.ClientModel.Primitives { internal class JsonPathComparer : IEqualityComparer<byte[]> { [System.Runtime.CompilerServices.Nullable(1)] internal static readonly JsonPathComparer Default = new JsonPathComparer(); [System.Runtime.CompilerServices.NullableContext(2)] public bool Equals(byte[] x, byte[] y) { if (x == y) return true; if (x == null || y == null) return false; return x.AsSpan().SequenceEqual(y.AsSpan()); } [System.Runtime.CompilerServices.NullableContext(1)] public int GetHashCode(byte[] obj) { return GetHashCode(obj.AsSpan()); } public bool Equals(ReadOnlySpan<byte> alternate, [System.Runtime.CompilerServices.Nullable(1)] byte[] other) { if (other == null) return false; return alternate.SequenceEqual(other.AsSpan()); } public int GetHashCode(ReadOnlySpan<byte> alternate) { int num = 17; for (int i = 0; i < alternate.Length; i++) { num = num * 31 + alternate[i]; } return num; } [return: System.Runtime.CompilerServices.Nullable(1)] public byte[] Create(ReadOnlySpan<byte> alternate) { return alternate.ToArray(); } public void Normalize(ReadOnlySpan<byte> jsonPath, Span<byte> buffer, out int bytesWritten) { ReadOnlySpan<byte> readOnlySpan = jsonPath; bytesWritten = 0; int length = jsonPath.Length; int num = 0; bool flag = false; bool flag2 = false; ReadOnlySpan<byte> readOnlySpan2; for (int i = 0; i < length; i++) { byte b = jsonPath[i]; if (b == 91 && i + 1 < length && (jsonPath[i + 1] == 39 || jsonPath[i + 1] == 34)) { readOnlySpan2 = readOnlySpan.Slice(0, num); readOnlySpan2.CopyTo(buffer.Slice(bytesWritten)); readOnlySpan = readOnlySpan.Slice(num + 2); bytesWritten += num; num = 0; buffer[bytesWritten++] = 46; i++; flag = true; } else if (b == 93 && i - 1 >= 0 && (jsonPath[i - 1] == 39 || jsonPath[i - 1] == 34)) { num--; readOnlySpan2 = readOnlySpan.Slice(0, num); readOnlySpan2.CopyTo(buffer.Slice(bytesWritten)); readOnlySpan = readOnlySpan.Slice(num + 2); bytesWritten += num; num = 0; if (flag2) { buffer[bytesWritten++] = 39; buffer[bytesWritten++] = 93; flag2 = false; } flag = false; } else if (((b == 46) & flag) && !flag2) { buffer[bytesWritten - 1] = 91; buffer[bytesWritten++] = 39; flag2 = true; num++; } else { num++; } } if (num > 0) { readOnlySpan2 = readOnlySpan.Slice(0, num); readOnlySpan2.CopyTo(buffer.Slice(bytesWritten)); bytesWritten += num; } } public unsafe int GetNormalizedHashCode(ReadOnlySpan<byte> jsonPath) { int length = jsonPath.Length; Span<byte> span = new Span<byte>(stackalloc byte[(int)(uint)length], length); Normalize(jsonPath, span, out int bytesWritten); span = span.Slice(0, bytesWritten); return GetHashCode(span); } public unsafe bool NormalizedEquals(ReadOnlySpan<byte> x, ReadOnlySpan<byte> y) { if (x.SequenceEqual(y)) return true; int length = x.Length; Span<byte> buffer = new Span<byte>(stackalloc byte[(int)(uint)length], length); length = y.Length; Span<byte> buffer2 = new Span<byte>(stackalloc byte[(int)(uint)length], length); Normalize(x, buffer, out int bytesWritten); Normalize(y, buffer2, out int bytesWritten2); if (bytesWritten != bytesWritten2) return false; return buffer.Slice(0, bytesWritten).SequenceEqual(buffer2.Slice(0, bytesWritten2)); } } }