假设我们有一个字符串name = "stackoverflow.com"。 如何将此字符串转换为唯一ID或某种哈希值(不使用md5,因为它太大),且不应该是随机的。 我想要的东西应该像这样:
请注意,字符串本身太长,我想知道是否可以用字母,数字和符号的组合来缩短字符串长度。
请注意,字符串本身太长,我想知道是否可以用字母,数字和符号的组合来缩短字符串长度。
如果不限制您的域名,这将是不可能的。由于有无限多个字符串,因此不能在任何有限集合中映射它们。因此,唯一性是不可能的。
如果您确实需要字符串的唯一标识符,请使用字符串本身。
n
的字符串实例比长度小于n
的实例更多。 - jasonname.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
是一个不好的想法,因为算法可能会改变,从而破坏 string
和 int
之间的任何映射关系。 - jason如果您使用哈希,它需要足够长才能保证唯一性,这可能比您想要的还要长。
您需要使用 2^(BitLength/2) >> n
,其中 BitLength 是哈希长度,n 是字符串数量。
使用 Dictinary<string,int>
和计数器行不行呢?
Jason说得很对——你无法创建一个有限大小的唯一哈希值,该哈希值可以是任意长度。我向您提出的建议是,您要寻找的不是哈希值,而是短字符串上的压缩算法。
String.GetHashCode
з”ҹжҲҗзҡ„е“ҲеёҢеҖјеҗ—пјҹ - driis