2012-08-13 116 views
1

我正在尋找生成一個唯一的隨機散列,其中有一個很小的機會被重複。它應該只包含數字,我希望它是4個字符長。我在從文件名生成唯一散列

filepath = "c:\\users\\john\\filename.csv" 

形式的文件路徑現在,我想只能選擇該字符串的「文件名」的一部分,並從該文件名創建哈希,雖然我希望每一次它是不同的所以如果兩個用戶上傳一個類似命名的文件,它可能會生成不同的哈希碼。要做到這一點,最好的方法是什麼?

我將使用此散列來附加「001」,「002」等以創建學生ID。

+2

4位數字根本不足以涵蓋文件名的所有組合。 – SimpleVar 2012-08-13 16:10:52

+3

_「一個獨特的隨機散列,它有一個很小的機會被複制,4位數字」_這是不現實的。 – 2012-08-13 16:11:03

+0

FAT 8.3「短名稱」的第一個或最後4個字符? – user957902 2012-08-13 16:11:18

回答

4

生成unique hash from a file's filename非常簡單。

但是......

它應該只包含數字,我希望它是4個字符長。

由於只有4個數字字符,你要保證有1000個不同的文件衝突,並可能會被擊中了不少越快。這使得不可能有「被複制的極小機會」。


編輯迴應評論:

你可以做一些簡單的散列類型,雖然這會給相當多的碰撞:

string ComputeFourDigitStringHash(string filepath) 
{ 
    string filename = System.IO.Path.GetFileNameWithoutExtension(filepath); 
    int hash = filename.GetHashCode() % 10000; 
    return hash.ToString("0000"); 
} 

這會給你一個4位數「散列「來自字符串的文件名部分。請注意,它會有很多衝突,但它會給你一些你可以使用的東西。

+0

對不起,我應該更清楚。主要目標是讓它在輸出相同的文件名時輸出不同的散列。我知道最終可能會出現重複,但只要我可以依靠,說5個重複的文件名,有很好的機會生成不同的哈希值,就沒有問題。 – Hyung 2012-08-13 17:36:34

+0

另外,我想生成一個4字符的散列。我覺得這應該是相當簡單的,比鏈接的項目要多得多。有沒有內置的方法來做到這一點? – Hyung 2012-08-13 17:40:16

+0

@Hyung沒有內置的方法來做你想做的事。使用4位數字和通用哈希例程,您將很容易地獲得重複的內容 - 這與協同工作並無太大關係。 – 2012-08-13 17:42:46