簡體   English   中英

總是唯一的Guid不夠獨特

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM