File: Rendering\TypeNameHash.cs
Web Access
Project: src\aspnetcore\src\Components\Endpoints\src\Microsoft.AspNetCore.Components.Endpoints.csproj (Microsoft.AspNetCore.Components.Endpoints)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Security.Cryptography;
using System.Text;

namespace Microsoft.AspNetCore.Components.Endpoints;

// Internal for testing.
internal class TypeNameHash
{
    public const int MaxStackBufferSize = 1024;

    public static string Compute(Type type)
    {
        if (type.FullName is not { } typeName)
        {
            throw new InvalidOperationException($"Cannot compute a hash for a type without a {nameof(Type.FullName)}.");
        }

        Span<byte> typeNameBytes = stackalloc byte[MaxStackBufferSize];

        if (!Encoding.UTF8.TryGetBytes(typeName, typeNameBytes, out var written))
        {
            typeNameBytes = Encoding.UTF8.GetBytes(typeName);
            written = typeNameBytes.Length;
        }

        Span<byte> typeNameHashBytes = stackalloc byte[SHA256.HashSizeInBytes];
        SHA256.HashData(typeNameBytes[..written], typeNameHashBytes);

        return Convert.ToHexString(typeNameHashBytes);
    }
}