我有一个客户,要求我生成完全独特的ID,永远不会复制。
他不会接受这样一个事实:Guid.NewGuid()
统计上不会重复,直到天https://stackoverflow.com/a/1705027/937131结束。
所以我把这作为一个挑战,并尝试制作一个方法,生成一个永远不会重复a.k.a. NONCE的ID。
我的一般想法是,如果我可以在每个Guid的末尾加入一个时间部分,这应该有效。
关于如何改进这一点的任何想法?
namespace JensB.Tools
{
public class RandomGenerator
{
public string GetNOnce()
{
string unique = Guid.NewGuid().ToString();
unique = unique.Replace("-", "");
long unixTimestamp = (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
string timeString = ToBase62(unixTimestamp);
unique = unique + timeString;
return unique;
}
private string ToBase62(long input)
{
string baseChars = ALPHANUMERIC_ALT;
string r = string.Empty;
int targetBase = baseChars.Length;
do
{
r = string.Format("{0}{1}",
baseChars[(int)(input % targetBase)],
r);
input /= targetBase;
} while (input > 0);
return r;
}
private static string ALPHANUMERIC_ALT =
"23456789" +
"abcdefghjkmnpqrstuvwxyz";
}
}
答案 0 :(得分:1)
您可以维护所有先前生成的GUID的列表,例如在数据库中,然后拒绝任何碰撞。
通过这种方式,您可以保证您生成的所有GUID都是唯一的。
答案 1 :(得分:1)
生成两个GUID并将它们添加到一起....这真的永远不会重复!
创建guid的原始方法之一涉及机器MAC地址和时间。 发现这不像人们可能猜到的那么可靠。
答案 2 :(得分:1)
我有一个客户,要求我生成完全独特的ID,永远不会复制。
这当然不可能。请参阅Pigeonhole principle。
UUID是128位整数,因此可以有2 ^ 128个唯一ID。因此,如果您生成2 ^ 128 + 1个ID,则至少有一个重复。
对于真实场景,Guid.NewGuid()
足够好了。