生成人类可读/可用,简短但唯一的ID
-
每天需要处理> 1000但是<10000条新记录
-
不能使用GUID / UUID,自动递增数字等
-
理想情况下应该是5或6个字符长,当然可以是阿尔法
-
如果可用的话,希望重用现有的,众所周知的算法
什么都有
tinyurl和bit.ly使用base 62作为缩写的URL。 这是一个很好理解的方法来创建“唯一”,人类可读的ID。 当然,您将不得不存储创建的ID并在创建时检查重复项以确保唯一性。 (请参阅答案底部的代码)
基数62的唯一性度量
在62基数5个字符会给你62 ^ 5独特的ID = 916,132,832(约10亿)在每天10k ID你可以91k +天
6个字符的基数62会给你62 ^ 6个唯一的ID = 56,800,235,584(56 + 10亿)每天10万个ID你可以在5百万天以上
基于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
我建议http://hashids.org/将任何数字(例如DB ID)转换成一个字符串(使用salt)。
它允许解码这个字符串回到数字。 所以你不需要把它存储在数据库中。
C#,C#,C ++,C ++,C#语言,C#语言,C#语言,C#语言,Ruby,Python,Java,Scala,PHP,Perl,Swift,Clojure, CoffeeScript和Node.js和.NET。
我和OP有类似的要求。 我查看了可用的库,但其中大部分都是基于随机性的,我不想要这样的库。 我真的找不到任何不是随机的,但仍然很短的东西…所以我最终根据Flickr使用的技术来滚动我自己的,但是修改为需要较少的协调,并允许更长的时间离线。
简而言之:
- 中央服务器发出由32个ID组成的ID块
- 本地ID生成器维护ID块的池,以在每次请求时生成ID。 当池运行时,它会从服务器获取更多的ID块来重新填充它。
缺点:
- 需要中央的协调
- ID或多或少是可预测的(不如常规DB ID,但它们不是随机的)
优点
- 存放在53位(Javascript / PHP最大大小为整数)
- 很短的ID
- 编码的基地36非常容易人类读,写和发音
- 在需要再次与服务器联系之前,ID可以在本地生成很长时间(取决于池设置)
- 理论上没有犯罪的机会
我已经发布了一个用于客户端的Javascript库,以及一个Java EE服务器实现。 其他语言的服务器也应该很容易。
这里是项目:
suid – 分布式服务唯一标识,简短而亲切
suid-server-java – Java EE技术栈的Suid-server实现。
这两个库都可以在自由的Creative Commons开源许可下获得。 希望这可以帮助别人寻找简短的唯一ID。
当我为几年前开发的应用程序解决这个问题时,我使用了基数36 。 我需要生成一个人类可读的合理唯一的数字 (无论如何在当前日历年内)。 我选择了从当年1月1日午夜开始的毫秒时间(因此每年的时间戳可能会重复),并将其转换为基数为36的数字。 如果正在开发的系统遇到了一个致命的问题,它会生成基本的36位数字(7个字符),并通过Web界面显示给最终用户,然后他们可以将遇到的问题(和数字)转达给技术支持人员然后可以使用它来查找堆栈跟踪开始的日志中的点)。 像56af42g7这样的数字对于用户来说是比2016-01-21T15:34:29.933-08:00或诸如5f0d3e0c-da96-11e5-b5d2-0a1d41d68578的随机UUID更容易读取和中继的。