生成人类可读/可用,简短但唯一的ID

Kum*_*mar 72 .net database identity

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

  • 无法使用GUID/UUID,自动递增数字等.

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

  • 想重用现有的,众所周知的算法(如果有的话)

还有什么吗?

Pau*_*sik 101

baseur用于base 62,bit.ly用于缩写的URL.这是一种易于理解的方法,用于创建"独特的"人类可读ID.当然,您必须存储创建的ID并在创建时检查重复项以确保唯一性.(见答案底部的代码)

基本62个唯一性指标

基地62中的5个字符将为您提供62 ^ 5个唯一ID = 916,132,832(~1亿)每天10k ID,您可以获得91k +天

基地62的6个字符将为您提供62 ^ 6个唯一身份证= 56,800,235,584(56亿以上)每天10k身份证,您可以获得超过500万天

基本36个唯一性指标

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

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

码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

z5KyMg
wd4SUp
uSzQtH
UPrGAT
UIf2IS

QCF9GNM5
0UV3TFSS
3MG91VKP
7NTRF10T
AJK3AJU7

  • 一想法.也许拿出元音来防止意外产生咒骂词.特别是如果它是公众面临的. (8认同)
  • 看起来很棒,任何不区分大小写的东西? (3认同)
  • 根据您使用此处的位置(特别是如果希望人们阅读并重新输入代码),您可能需要考虑从考虑中删除经常混淆的字符:0/O和I/l/1.在某些情况下,这可以通过良好的字体选择来缓解,但我无法从问题中判断OP是否可以控制它. (3认同)
  • 当我们创建更多的 id 时,数据库检查会发现越来越多的重复项,从而导致性能下降。因此,从长远来看,这种方法无法扩展。 (3认同)
  • 如果要避免区分大小写,可以使用基数36:http://www.codeproject.com/Articles/10619/Base-36-type-for-NET-C,但要获得与基数62一样多的排列,您需要在ID中使用更多字符。这是一个权衡。或者,您可以尝试使用除alpha之外的其他字符,但这对用户来说很难看。 (2认同)
  • 这里http://stackoverflow.com/questions/9543892/any-sql-server-proc-for-base36非常感谢 (2认同)

Sla*_*awa 15

我推荐http://hashids.org/将任何数字(例如DB ID)转换为字符串(使用salt).

它允许将此字符串解码回数字.因此您无需将其存储在数据库中.

拥有JavaScript,Ruby,Python,Java,Scala,PHP,Perl,Swift,Clojure,Objective-C,C,C++ 11,Go,Erlang,Lua,Elixir,ColdFusion,Groovy,Kotlin,Nim,VBA的库, CoffeeScript和Node.js和.NET.


Sti*_*itt 6

我有与OP相似的要求.我查看了可用的库,但大多数是基于随机性的,我不想这样.我真的找不到任何基于随机而且仍然很短的东西...所以我最终根据Flickr使用的技术滚动我自己,但修改为需要较少的协调并允许更长时间离线.

简而言之:

  • 中央服务器发出ID块,每个ID块包含32个ID
  • 本地ID生成器维护一个ID块池,以便在每次请求时生成ID.当池运行不足时,它会从服务器获取更多ID块以再次填充它.

缺点:

  • 需要中央协调
  • ID或多或少是可预测的(不如常规数据库ID,但它们不是随机的)

好处

  • 保留在53位(整数的Javascript/PHP最大大小)
  • 非常短的ID
  • Base 36编码使得人类非常容易阅读,书写和发音
  • 在需要再次与服务器联系之前,可以在本地生成ID很长时间(取决于池设置)
  • 理论上没有碰撞的机会

我已经为客户端发布了一个Javascript库,以及一个Java EE服务器实现.用其他语言实现服务器也应该很容易.

以下是项目:

suid - 分布式服务 - 短而甜的唯一ID

suid-server-java - Java EE技术堆栈的Suid服务器实现.

这两个库都是在自由的Creative Commons开源许可下提供的.希望这可以帮助其他人寻找简短的唯一ID.

  • 它基于随机数。实际上,这非常棒。但您的 ID 不会尽可能短。我编写了 SUID 以从 1 开始编号,因此您将从“极短”ID 开始。考虑 3 或 4 个字符。另外,除了从非常短的 ID 开始之外,拥有(大致)增量排序的 ID 还具有其他一些很好的优点。 (2认同)