Iceshrimp.NET/Iceshrimp.Backend/Core/Helpers/IdHelpers.cs
2024-11-19 19:38:31 +01:00

23 lines
No EOL
815 B
C#

using Iceshrimp.Backend.Core.Extensions;
namespace Iceshrimp.Backend.Core.Helpers;
public static class IdHelpers
{
private const long Time2000 = 946684800000;
public static string GenerateSnowflakeId(DateTime? createdAt = null)
{
if (createdAt is { Kind: not DateTimeKind.Utc })
createdAt = createdAt.Value.ToUniversalTime();
createdAt ??= DateTime.UtcNow;
// We want to use a charset with a power-of-two amount of possible characters for optimal CSPRNG performance.
var random = CryptographyHelpers.GenerateRandomString(8, CryptographyHelpers.Charset.CrockfordBase32Lower);
var now = createdAt.Value.Subtract(DateTime.UnixEpoch).GetTotalMilliseconds();
var time = Math.Max(now - Time2000, 0);
var timestamp = time.ToBase36().PadLeft(8, '0');
return timestamp + random;
}
}