2013-10-20 56 views
0

我只是想知道通常的方法是生成一個任意長度的隨機大小寫字母的唯一字符串?生成隨機上/下字母的唯一5字符序列?

我的直接想法是使用我使用的編程框架提供的guid生成器,然後將一個衆所周知的散列算法應用於guid。

如果是這樣的話,我需要研究哪些類型的散列函數?

感謝

+1

'random!= unique'!即使是guid在技術上也不是獨一無二的。只有非常非常不可能的是,同一個將會被生產兩次。這只是由於guid基本上是非常大的數字(比5個字符多得多*),並且創建它們的算法具有非常好的分佈。如果你確實需要保證唯一性,那麼你需要「記住」你生成的所有東西,如果你得到了已經生成的東西,就要再次生成。 – Corak

+0

或者更好的是,對於相對較小的範圍:生成*所有*可能性,然後隨機選擇一個並將其從下一次的可能性列表中刪除。 – Corak

回答

1

創建一個GUID是不是得到一個隨機數的好方法,如在GUID並不是所有的數據是隨機的。請使用Random類。例如:然而

string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
int len = 5; 

Random rnd = new Random(); 
StringBuilder b = new StringBuilder(len); 
for (int i = 0; i < len; i++) { 
    b.Append(chars[rnd.Next(chars.Length)]); 
} 
string result = b.ToString(); 

注意,這並不保證代碼是獨特。爲了實現這一點,你必須保存所有以前的代碼,並檢查那些用於任何新代碼的代碼。儘管GUID被認爲足夠不足,但從GUID生成的短散列沒有該屬性。

+0

非常感謝你,一個優雅的解決方案,絕對是我的一個想法。 – ShaunO

+0

「隨機」不是一個密碼安全的隨機數生成器。可以從幾個輸出值中導出發生器的內部狀態(並因此預測所有未來和以前的隨機值),所以它不能用於不可能發生的情況。 .NET API確實有一個密碼安全的隨機生成器,但由於我對.NET不熟悉,所以我無法提供幫助。 – ntoskrnl

+0

@ntoskrnl:這是真的,但加密保護並不意味着它是唯一的。 – Guffa