让我们假设我们有字符串名称=“stackoverflow.com”;C#如何将字符串转换为唯一的ID
如何将此字符串int转换为唯一ID或某种哈希。 (无MD5,因为它太大了),它不应该是随机的
我会想有这样的事情
请注意字符串本身太大,我想知道,如果字符串可以写短。在字母,数字和符号
f¤k^§〜7天?Æ
让我们假设我们有字符串名称=“stackoverflow.com”;C#如何将字符串转换为唯一的ID
如何将此字符串int转换为唯一ID或某种哈希。 (无MD5,因为它太大了),它不应该是随机的
我会想有这样的事情
请注意字符串本身太大,我想知道,如果字符串可以写短。在字母,数字和符号
f¤k^§〜7天?Æ
这是一个没有限制你的域名是不可能的组合。有无限多的string
s,因此不能被映射到任何有限集合中。因此,唯一性是不可能的。
如果您确实想要string
的唯一标识符,请使用string
本身。
井字符串本身太大我想知道如果字符串可以写得更短。在字母,数字和符号的组合中 – 2011-01-08 13:18:36
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;
}
(从别处被盗)
如果你使用散列,它需要足够的只要是独一无二的,那可能比你想要的还要长。 您需要2^(BitLength/2) >> n
,其中BitLength是散列的长度,n是字符串的数量。
如何使用Dictinary<string,int>
和计数器代替?
Jason是非常正确的 - 你不能创建一个可以任意长度的字符串的有限大小的唯一散列。我向你承诺,你正在寻找的不是一个散列,而是一个compression algorithm on short strings。
有什么东西阻止你使用`String.GetHashCode`产生的散列吗? – driis 2011-01-08 12:58:34
**任何**散列应该是**不唯一**,只是因为它是一个散列。因为你想要的东西比md5短(16bytes,而你建议获得10bytes的长度) - 准备好碰撞。 – zerkms 2011-01-08 13:01:07
如果你会解释_为什么你需要这个 - 你会得到更好的答案 - 为了什么目的,它将如何使用以及由谁来使用? – 2011-01-08 13:43:56