C# ULID 浅析(c#uuid)

C# ULID 浅析(c#uuid)

编码文章call10242025-02-01 3:33:0313A+A-

ULID(Universally Unique Lexicographically Sortable Identifier)是一种在C#中生成唯一标识符的算法。它结合了时间戳和随机数,生成的标识符具有以下优缺点:

优点:

  1. 唯一性:ULID使用时间戳和随机数生成标识符,因此可以保证生成的标识符在同一个分布式系统中的唯一性。
  2. 可排序性:ULID的结构允许按照字典顺序进行排序,这对于数据库索引和范围查询非常有用。
  3. 紧凑性:ULID的字符串表示形式只有26个字符长度,比一些其他标识符格式(如UUID)更紧凑。
  4. 有序性:ULID的时间戳部分精确到毫秒级,可以提供时间有序性,这在需要根据时间顺序检索数据时很有用。

缺点:

  1. 不适用于操作系统级别的唯一性:ULID的唯一性是在分布式系统内部保证的,不能保证在整个操作系统级别上唯一。
  2. 依赖于时间戳:ULID的生成过程中依赖于时间戳,如果系统时钟不准确或存在时钟回拨问题,可能会导致生成的标识符不唯一。
  3. 随机数可能重复:ULID的随机数部分使用高质量随机数生成器生成,但在极端情况下,随机数可能会重复,导致生成的标识符不唯一。

总体而言,ULID是一种在分布式系统中生成唯一标识符的有效方法,它具有唯一性、可排序性和紧凑性等优点。然而,使用ULID时需要注意时钟同步和随机数生成的问题,以确保生成的标识符的唯一性和可靠性。

以下是一个简单的C# ULID生成器的示例代码:

using System;
using System.Security.Cryptography;

public class ULIDGenerator
{
    private static readonly RandomNumberGenerator rng = RandomNumberGenerator.Create();

    public static string Generate()
    {
        byte[] data = new byte[10];
        rng.GetBytes(data);

        ulong timestamp = (ulong)DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
        byte[] timestampBytes = BitConverter.GetBytes(timestamp);

        byte[] ulidBytes = new byte[16];
        Array.Copy(timestampBytes, ulidBytes, 6);
        Array.Copy(data, 0, ulidBytes, 6, 10);

        return Base32Encode(ulidBytes);
    }

    private static string Base32Encode(byte[] data)
    {
        const string chars = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
        string result = "";

        int bitCount = 0;
        int accumulator = 0;

        foreach (byte b in data)
        {
            accumulator = (accumulator << 8) | b;
            bitCount += 8;

            while (bitCount >= 5)
            {
                int index = (accumulator >> (bitCount - 5)) & 31;
                result += chars[index];
                bitCount -= 5;
            }
        }

        if (bitCount > 0)
        {
            int index = (accumulator << (5 - bitCount)) & 31;
            result += chars[index];
        }

        return result;
    }
}

public class Program
{
    public static void Main()
    {
        string ulid = ULIDGenerator.Generate();
        Console.WriteLine(ulid);
    }
}

这个示例代码展示了一个简单的ULID生成器,使用了C#的RandomNumberGenerator类来生成随机数,并结合当前时间戳生成ULID。运行程序后,它将打印出生成的ULID。请注意,这只是一个简单的示例,真实的ULID实现可能会更复杂和健壮。

当然我们也可以使用 Ulid.NET 开源库

以下是使用Ulid.NET的基本步骤:

  1. 安装Ulid.NET库:在Visual Studio中右键点击项目,选择"管理NuGet程序包",搜索并安装Ulid.NET
  2. 导入命名空间:
using UlidNet;
  1. 生成ULID标识符:
Ulid ulid = Ulid.NewUlid();
string ulidString = ulid.ToString();
  1. 从ULID字符串解析ULID对象:
string ulidString = "01F377Y5X0J3J0G7CRKA3N6525";
Ulid ulid = Ulid.Parse(ulidString);
  1. 获取ULID的时间戳和其他属性:
DateTimeOffset timestamp = ulid.TimeStamp;
ulong randomPart = ulid.RandomPart;

以上是使用Ulid.NET库生成和操作ULID标识符的基本步骤。ULID标识符是基于时间的,拥有全局唯一性和排序性能,适用于需要分布式排序和唯一标识符的场景。你可以根据具体需求,进一步探索和使用Ulid.NET库提供的其他功能。

创作不易,如果您喜欢还请帮忙点赞关注,谢谢!

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4