2011-01-08 32 views
3

让我们假设我们有字符串名称=“stackoverflow.com”;C#如何将字符串转换为唯一的ID

如何将此字符串int转换为唯一ID或某种哈希。 (无MD5,因为它太大了),它不应该是随机的

我会想有这样的事情

请注意字符串本身太大,我想知道,如果字符串可以写短。在字母,数字和符号

f¤k^§〜7天?Æ

+3

有什么东西阻止你使用`String.GetHashCode`产生的散列吗? – driis 2011-01-08 12:58:34

+0

**任何**散列应该是**不唯一**,只是因为它是一个散列。因为你想要的东西比md5短(16bytes,而你建议获得10bytes的长度) - 准备好碰撞。 – zerkms 2011-01-08 13:01:07

+0

如果你会解释_为什么你需要这个 - 你会得到更好的答案 - 为了什么目的,它将如何使用以及由谁来使用? – 2011-01-08 13:43:56

回答

6

这是一个没有限制你的域名是不可能的组合。有无限多的string s,因此不能被映射到任何有限集合中。因此,唯一性是不可能的。

如果您确实想要string的唯一标识符,请使用string本身。

+0

井字符串本身太大我想知道如果字符串可以写得更短。在字母,数字和符号的组合中 – 2011-01-08 13:18:36

0

name.GetHashCode()

这可能是您最好的选择。任何形式的散列都是一个常见的问题,它不能被认为是唯一的,但是通过允许散列更长,你可以使它更有可能是唯一的。

你也可以使用结合不同的哈希算法彼此增加支持的范围

编辑

然后,你可以创建一个自定义的杂凑码功能,如

public static int GetHashCode (string value) 
{ 
int h = 0; 
for (int i = 0; i < value.Length; i ++) 
h += value [i] * 31^value.Length - (i + 1); 
return h; 
} 

(从别处被盗)

1

如果你使用散列,它需要足够的只要是独一无二的,那可能比你想要的还要长。 您需要2^(BitLength/2) >> n,其中BitLength是散列的长度,n是字符串的数量。

如何使用Dictinary<string,int>和计数器代替?

0

Jason是非常正确的 - 你不能创建一个可以任意长度的字符串的有限大小的唯一散列。我向你承诺,你正在寻找的不是一个散列,而是一个compression algorithm on short strings

相关问题