每天需要处理 > 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/