.net - 生成人类可读/可用、简短但唯一的 ID

标签 .net database identity

  • 每天需要处理 > 1000 但 < 10000 条新记录

  • 不能使用 GUID/UUID、自动递增数字等。

  • 理想情况下应该是 5 或 6 个字符长,当然可以是 alpha

  • 想要重用现有的、知名的算法(如果可用的话)

有什么东西吗?

最佳答案

tinyurl 和 bit.ly 使用 Base 62 作为缩略网址。这是创建“唯一的”、人类可读的 ID 的一种易于理解的方法。 当然,您必须存储创建的 ID 并在创建时检查重复项以确保唯一性。(请参阅答案底部的代码)

Base 62 唯一性指标

以 62 为基数的 5 个字符将为您提供 62^5 个唯一 ID = 916,132,832(约 10 亿) 每天 10,000 个 ID,您可以使用 91,000 天以上

6 个 base 62 字符将为您提供 62^6 个唯一 ID = 56,800,235,584(56+ 十亿) 每天 1 万个 ID,你将在 5 亿多天里都没事

Base 36 唯一性指标

6 个字符将为您提供 36^6 个唯一 ID = 2,176,782,336(2+ 十亿)

7 个字符将为您提供 36^7 个唯一 ID = 78,364,164,096(78+ 十亿)

代码:

public void TestRandomIdGenerator()
{
    // create five IDs of six, base 62 characters
    for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase62(6));

    // create five IDs of eight base 36 characters
    for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase36(8));
}

public static class RandomIdGenerator 
{
    private static char[] _base62chars = 
        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
        .ToCharArray();

    private static Random _random = new Random();

    public static string GetBase62(int length) 
    {
        var sb = new StringBuilder(length);

        for (int i=0; i<length; i++) 
            sb.Append(_base62chars[_random.Next(62)]);

        return sb.ToString();
    }       

    public static string GetBase36(int length) 
    {
        var sb = new StringBuilder(length);

        for (int i=0; i<length; i++) 
            sb.Append(_base62chars[_random.Next(36)]);

        return sb.ToString();
    }
}

输出:

z5KyMg
wd4SUp
uSzQtH
UPrGAT
UIf2IS

QCF9GNM5
0UV3TFSS
3MG91VKP
7NTRF10T
AJK3AJU7

关于.net - 生成人类可读/可用、简短但唯一的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9543715/

相关文章:

c# - DateTime.ToString 从所有格式到 dd/MM/YYYY?

c# - Mongo C# 驱动程序 : Deserialize BsonValue

MySQL 执行 INTO FROM 时出现错误 1327

sqlite 获取附加数据库的名称

oop - 获取 ABAP 对象的标识号

c# - 处理后是否有可能获得 Timer.Tick 事件

sql优化搜索多对多

algorithm - 把三个32位的标识符合并成一个32位的标识符?

sql-server - 如何获取 SQL Server 2005 和 ASP 中使用的下一个标识号?

c# - 在代码中获取硬盘上最大的目录大小