.net C#如何将中的字符串转换为唯一ID

.net C#如何将中的字符串转换为唯一ID,.net,.net,假设我们有字符串name=“stackoverflow.com” 如何将此字符串int转换为唯一ID或某种哈希。(没有md5,因为它太大)并且它不应该是随机的 我想要这样的 请注意字符串本身太大,我想知道字符串是否可以写得更短。字母、数字和符号的组合 f·k^§~7dÆ 如果不限制您的域,这是不可能的。有无限多个字符串s,因此不能内射映射到任何有限集。因此,唯一性是不可能的 如果确实需要字符串的唯一标识符,请使用字符串本身 name.GetHashCode() 这可能是你最好的选择。任何形式的散

假设我们有字符串name=“stackoverflow.com”

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

我想要这样的

请注意字符串本身太大,我想知道字符串是否可以写得更短。字母、数字和符号的组合

f·k^§~7dÆ


如果不限制您的域,这是不可能的。有无限多个
字符串
s,因此不能内射映射到任何有限集。因此,唯一性是不可能的

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

name.GetHashCode()

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

您还可以将不同的哈希算法相互结合使用,以增加支持的范围

编辑

然后您可以创建一个自定义Hashcode函数,例如

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;
}
public static int GetHashCode(字符串值)
{
int h=0;
for(int i=0;i

(从别处偷来的)

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


用一个单词和一个计数器来代替怎么样?

Jason说得很对——你不能创建一个大小可以任意长的字符串的有限大小的唯一散列。我想告诉你,你要找的不是散列,而是散列。

是否有任何东西阻止你使用由
String.GetHashCode
生成的散列?任何散列都不应该是唯一的,因为它是散列。既然你想要比md5短的东西(16字节,你建议使用10字节的长度),那么就准备好进行碰撞。如果你能解释为什么需要这个,你会得到更好的答案——为了什么目的,它将如何使用,由谁使用?看看这个,它可能会很有用:没有“足够长”的长度为了保证唯一性,你可以通过选择更长的散列来使概率任意小。一旦它小于硬件错误的概率,就足够了。一个加密安全的128位哈希就足够了,但在Base64中大约有22个字符长。
GetHashCode
是个坏主意,因为算法可以改变
string
s和
int
s之间的任何映射。字符串本身太大了,我想知道字符串是否可以写得更短。字母、数字和数字的组合symbols@Power-Mosfet:再一次,如果不限制你的领域,这是不可能的。长度
n
string
实例比长度小于
n
的实例多。intput=“stackoverflow.com”;输出=“81c74c7a”;intput=“stackoverflow.Com”;输出=“b98a0a9a”;注意,同样的逻辑也适用于无损压缩算法。必须有一些字符串的“压缩”版本比字符串本身长。