每天需要处理 > 1000 但 < 10000 条新记录
不能使用 GUID/UUIDs,自增数字等
最好是 5 或 6 个字符长,当然可以是字母
如果有现成的知名算法可以重用最好
有什么适合的吗?
每天需要处理 > 1000 但 < 10000 条新记录
不能使用 GUID/UUIDs,自增数字等
最好是 5 或 6 个字符长,当然可以是字母
如果有现成的知名算法可以重用最好
有什么适合的吗?
Base 62是tinyurl和bit.ly用于缩短URL的方法。它是一种为创建“唯一”的、可读性强的ID而被广泛使用的方法。当然,在创建ID时,您需要存储已创建的ID并检查重复项以确保唯一性。(请参见答案底部的代码)
Base 62唯一性度量
5个字符在Base 62中将为您提供62^5个唯一ID = 916,132,832(约1十亿) 每天10k个ID,您将可以使用91k+天
6个字符在Base 62中将为您提供62^6个唯一ID = 56,800,235,584(56+十亿) 每天10k个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
我推荐使用http://hashids.org/,它可以将任何数字(例如DB ID)转换为字符串(使用盐)。
该工具允许解码该字符串以返回原来的数字。因此您无需在数据库中存储它。
该工具具有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的库。
简而言之:
缺点:
优点:
我已经发布了一个用于客户端的Javascript库,以及一个Java EE服务器实现。在其他语言中实现服务器也应该很容易。
以下是这些项目:
suid - 分布式服务唯一ID,简短而甜美
suid-server-java - Java EE技术栈的Suid-server实现。
这两个库都可在宽松的知识共享开源许可下获得。 希望这可以帮助其他寻找短唯一ID的人。
我曾在几年前为一款应用程序解决问题时使用了36进制。我需要生成一个人类可读且相对唯一的号码(在当前日历年度内)。我选择使用从当前年份1月1日午夜开始到现在的毫秒数(每年的时间戳会重复)并将其转换为36进制的数字。如果正在开发的系统遇到致命问题,它将生成一个7个字符的36进制数字,并通过Web界面显示给最终用户,然后最终用户可以将遇到的问题(和数字)传达给技术支持人员(这样技术支持人员可以使用该数字找到日志中堆栈跟踪开始的地方)。对于用户来说,像56af42g7这样的号码比像2016-01-21T15:34:29.933-08: 00或随机UUID 5f0d3e0c-da96-11e5-b5d2-0a1d41d68578更容易阅读和传达。
var newGuid = Guid.NewGuid();
var messageID = Convert.ToBase64String(newGuid.ToByteArray());
var message22chars = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0,22);