C#如何将字符串转换为唯一标识符(ID)

3
假设我们有一个字符串name = "stackoverflow.com"。 如何将此字符串转换为唯一ID或某种哈希值(不使用md5,因为它太大),且不应该是随机的。 我想要的东西应该像这样:
请注意,字符串本身太长,我想知道是否可以用字母,数字和符号的组合来缩短字符串长度。

3
жңүд»Җд№Ҳйҳ»жӯўдҪ дҪҝз”ЁString.GetHashCodeз”ҹжҲҗзҡ„е“ҲеёҢеҖјеҗ—пјҹ - driis
任何哈希都应该是不唯一的,仅仅因为它是一个哈希。而且,由于您想要比md5更短的东西(它是16字节长的,您建议获取10字节长度的哈希),所以请准备好遇到碰撞。 - zerkms
如果你解释清楚为什么需要这个,例如用途、如何使用以及使用者是谁,那么你会得到更好的回答。 - Allon Guralnek
看一下这个,可能会有帮助: http://stackoverflow.com/questions/12933724/octcrypting-for-creating-unique-hash-codes - Gev
4个回答

7

如果不限制您的域名,这将是不可能的。由于有无限多个字符串,因此不能在任何有限集合中映射它们。因此,唯一性是不可能的。

如果您确实需要字符串的唯一标识符,请使用字符串本身。


字符串本身太长了,我想知道是否可以用字母、数字和符号的组合来缩短字符串。 - User6996
@Power-Mosfet:再次强调,如果不限制您的领域,这是不可能的。长度为n的字符串实例比长度小于n的实例更多。 - jason
输入 = "stackoverflow.com"; 输出 = "81c74c7a"; 输入 = "stackoverflow.Com"; 输出 = "b98a0a9a"; - User6996

1

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;
}

(从别处偷来的)


GetHashCode 是一个不好的想法,因为算法可能会改变,从而破坏 stringint 之间的任何映射关系。 - jason

1

如果您使用哈希,它需要足够长才能保证唯一性,这可能比您想要的还要长。

您需要使用 2^(BitLength/2) >> n ,其中 BitLength 是哈希长度,n 是字符串数量。

使用 Dictinary<string,int> 和计数器行不行呢?


没有长度可以“足够长”来保证唯一性。 - jason
1
通过选择更长的哈希值,您可以将概率任意降低。一旦它小于硬件错误的概率,那就足够了。加密安全的128位哈希已经足够,但在Base64中大约需要22个字符的长度。 - CodesInChaos

0

Jason说得很对——你无法创建一个有限大小的唯一哈希值,该哈希值可以是任意长度。我向您提出的建议是,您要寻找的不是哈希值,而是短字符串上的压缩算法


请注意,无损压缩算法也适用相同的逻辑。一些字符串的“压缩”版本比字符串本身更长。 - jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接