<PackageReference Include="System.Configuration.ConfigurationManager" Version="9.0.0" />

IdentityHelper

static class IdentityHelper
using System.IO; using System.Reflection; using System.Security.Cryptography; using System.Text; namespace System.Security { internal static class IdentityHelper { internal static string GetNormalizedUriHash(Uri uri) { return GetStrongHashSuitableForObjectName(uri.ToString()); } internal static string GetNormalizedStrongNameHash(AssemblyName name) { byte[] publicKey = name.GetPublicKey(); if (publicKey == null || publicKey.Length == 0) return null; using (MemoryStream memoryStream = new MemoryStream()) using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream)) { binaryWriter.Write(publicKey); binaryWriter.Write(name.Version.Major); binaryWriter.Write(name.Name); memoryStream.Position = 0; return GetStrongHashSuitableForObjectName(memoryStream); } } internal static string GetStrongHashSuitableForObjectName(string name) { using (MemoryStream memoryStream = new MemoryStream()) using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream)) { binaryWriter.Write(name.ToUpperInvariant()); memoryStream.Position = 0; return GetStrongHashSuitableForObjectName(memoryStream); } } internal static string GetStrongHashSuitableForObjectName(Stream stream) { using (SHA1 sHA = SHA1.Create()) return ToBase32StringSuitableForDirName(sHA.ComputeHash(stream)); } internal unsafe static string ToBase32StringSuitableForDirName(byte[] buff) { StringBuilder stringBuilder = new StringBuilder(); int num = buff.Length; int num2 = 0; ReadOnlySpan<byte> readOnlySpan = new ReadOnlySpan<byte>(&global::<PrivateImplementationDetails>.E19EC872C44A1E106B1945D46593E89BE1896CAB43757023BAAD2D1D69DAC8AD, 32); do { byte b = (byte)((num2 < num) ? buff[num2++] : 0); byte b2 = (byte)((num2 < num) ? buff[num2++] : 0); byte b3 = (byte)((num2 < num) ? buff[num2++] : 0); byte b4 = (byte)((num2 < num) ? buff[num2++] : 0); byte b5 = (byte)((num2 < num) ? buff[num2++] : 0); stringBuilder.Append((char)readOnlySpan[b & 31]); stringBuilder.Append((char)readOnlySpan[b2 & 31]); stringBuilder.Append((char)readOnlySpan[b3 & 31]); stringBuilder.Append((char)readOnlySpan[b4 & 31]); stringBuilder.Append((char)readOnlySpan[b5 & 31]); stringBuilder.Append((char)readOnlySpan[((b & 224) >> 5) | ((b4 & 96) >> 2)]); stringBuilder.Append((char)readOnlySpan[((b2 & 224) >> 5) | ((b5 & 96) >> 2)]); b3 = (byte)(b3 >> 5); if ((b4 & 128) != 0) b3 = (byte)(b3 | 8); if ((b5 & 128) != 0) b3 = (byte)(b3 | 16); stringBuilder.Append((char)readOnlySpan[b3]); } while (num2 < num); return stringBuilder.ToString(); } } }