2014-05-23 47 views
0

我有一個客戶端,它需要我生成完全獨特的ID,永遠不會重複。 他不會接受這樣一個事實,即Guid.NewGuid()在統計上不會重複,直到天數https://stackoverflow.com/a/1705027/937131結束。總是唯一的Guid不夠獨特

所以我把這作爲一個挑戰,並試圖做出一個方法,產生一個身份證,將永遠不會重複a.k.a. a 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"; 
    } 
} 
+4

告訴你的客戶他是一個偏執狂和一個完整的門外漢。創建一個包裝器,它會直接返回'Guid.NewGuid()',併爲客戶的工作計費。 – Tarec

+2

@Tarec:雖然我們中的很多人在做白日夢的時候肯定會這樣做,「商業上的考慮妨礙我採取這一建議」。 – Jon

+0

@Tarec他不會就此事做出讓步,所以我只是想看看是否有人對任何真正獨特的發電機有任何想法:) – JensB

回答

1

我有一個客戶端,它需要我生成完全獨特的ID,永遠不會重複。

這當然是不可能的。請參閱Pigeonhole principle

UUID是一個128位整數,因此可以有2^128個唯一ID。所以如果你生成2^128 + 1的ID,你至少有一個重複。


對於真實世界的場景,Guid.NewGuid()已經足夠好了。

1

您可以維護所有先前生成的GUID的列表,例如在數據庫中,然後拒絕任何發生衝突的列表。

這樣你可以保證你生成的所有GUID都是唯一的。

1

生成兩個GUIDS並將它們添加在一起....這將真的永遠不會重複!

創建guid的原始方式之一涉及機器的MAC地址和時間。 這被發現並不像人們可能猜到的那麼可靠。