2012-08-13 77 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