[英]Always unique Guid not unique enough
我有一個客戶,要求我生成完全唯一的ID,且永遠不會重復。 他不會接受Guid.NewGuid()
統計Guid.NewGuid()
不會重復直到https://stackoverflow.com/a/1705027/937131結束之前的事實。
因此,我將其視為挑戰,並嘗試創建一種方法,該方法生成的ID永遠不會重復NONCE 。
我的一般想法是,如果我可以在每個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";
}
}
您可以維護所有先前生成的GUID的列表(例如在數據庫中),然后拒絕任何沖突的GUID。
這樣,您可以保證所生成的所有GUID都是唯一的。
生成兩個GUIDS並將它們添加在一起。。。。
創建GUID的原始方法之一涉及機器的MAC地址和時間。 人們發現這並不可靠,因為人們可能會猜到很多。
我有一個客戶,要求我生成完全唯一的ID,且永遠不會重復。
那當然是不可能的。 參見鴿洞原理 。
UUID是一個128位整數,因此可以有2 ^ 128個唯一ID。 因此,如果生成2 ^ 128 + 1個ID,則至少有一個重復項。
對於現實世界的場景, Guid.NewGuid()
足夠好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.