2011-04-06 65 views
6

如何始終使用c#生成17個字符的唯一字母數字數據。如何生成獨特的字母數字?

+3

你永遠不能保證一個獨特的價值。在有限系統中沒有任何獨特之處。 – 2011-04-06 12:51:31

+0

您是否考慮過使用Guid.NewGuid()。ToString(「N」)。子串(0,17),儘管如上所述,您需要決定它需要的「獨特」,哦,它只有字母A到F :-) – 2011-04-06 13:04:19

+0

@ DanielA.White根據[This Document](http://www.ietf.org/rfc/rfc4122.txt)的第3頁,GUID類可以生成一個唯一值。 – Amir 2013-05-02 18:47:44

回答

5

生成新的Guid,並通過模62分割17次。您獲得的每個數字都是上述char數組中的索引(「abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW XYZ1234567890」)。 通過使用Guid,您可以保證您的價值與Guid一樣獨特。

如果您關心失去唯一位你可以用MD5哈希GUID是這樣的:

Guid guidValue = Guid.NewGuid(); 
MD5 md5 = MD5.Create(); 
Guid hashed = new Guid(md5.ComputeHash(guidValue.ToByteArray())); 

UPDATE的GUID格式

根據這一文件(RFC 4122),並比較所產生的GUID C#,它們是隨機類型的。

這種類型的具有以下模式:xxxxxxxx-xxxx-4xxx-Vxxx-xxxxxxxxxxxx,其中

  • x是隨機數,並且
  • V與位佈局10yy,其中yy是兩個隨機比特的數目。

所以,這裏我們有128個隨機比特。因此,就唯一性而言,Guid只是一個大的隨機數,您可以自由使用任何其他隨機數生成算法,產生88位隨機數(例如RNGCryptoServiceProvider)。

當然,用於生成Guids的方法可能會在未來版本的框架中發生變化,但目前Guid.NewGuid()看起來就像代碼中的廉價隨機數生成器。

+0

+1,因爲GUID是唯一的,並且這些算法儘可能地保留了唯一性。 – 2011-04-06 13:12:18

+1

@Cosmin:你不能保證在不知道GUID是如何生成的情況下,儘可能地保留GUID的唯一性。這種算法可能會失去所有保證唯一性的位(我並不是說它確實存在,但這是一種理論上的可能性)。 – LukeH 2011-04-06 13:18:26

+0

@LukeH:注意到在帖子後面...我通過將GUID的剩餘部分除以大的108位素數來解決這個問題。或者通過做一些部分異或操作來確保我處理了12個字節,這些字節受初始16個字節中所有位的影響。當然,它不可能具有與最初的GUID相同的屬性,但它會非常好。 – 2011-04-06 13:50:20

2

您可以硬編碼字符集 -

char[] chars = new char[62]; 
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW XYZ1234567890".ToCharArray(); 

然後用62 0之間的隨機數,即可獲得隨機字符每次和追加到您的字符串。

但是,您不能保證在某個時間的車道上,您也不會收到重複的字母數字字符串。

作爲替代,如果可能的話,爲什麼不使用GUID

+1

如果一個GUID可以在其範圍內(128位)「保證」唯一性,那麼爲什麼17字符A-Za-z0-9字符串不能保證其自身範圍(大約100位)的唯一性?使用正確的算法,您可以在需要重複自己之前生成2 ** 100個獨特的字符串。 – LukeH 2011-04-06 13:07:17

+1

17位字符串由您生成。如果你有一個算法來檢查唯一性,那麼它可以得到保證。否則沒有。 – 2011-04-06 13:28:02

3

你可以試試... http://msdn.microsoft.com/en-us/library/system.io.path.getrandomfilename.aspx

的GetRandomFileName方法返回一個可以作爲任何一個文件夾名或文件名保密性強,隨機字符串。

或任何你想要的。

+0

請注意,此方法有一定的侷限性:在每次調用時,您只能獲得11個小寫字母數字字符,因爲它爲您提供了8.3格式的文件/文件夾名稱(即「qwer176d.d9s」)。 – Artemix 2011-04-06 15:17:51