【问题标题】:C# how to convert string in to unique IDC#如何将字符串转换为唯一ID
【发布时间】:2011-01-08 12:56:02
【问题描述】:

假设我们有字符串 name = "stackoverflow.com";

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

我想要这样的东西

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

f¤k^§~7d?Æ

【问题讨论】:

  • 有什么阻止你使用String.GetHashCode产生的哈希?
  • Any 散列应该是不是唯一的,只是因为它是一个散列。而且由于您想要比 md5 短的东西(即 16 字节,并且您建议获得 10 字节的长度) - 准备好发生冲突。
  • 如果你能解释为什么你需要这个,你会得到更好的答案 - 出于什么目的,将如何使用它以及由谁使用?
  • 看看这个,会有帮助的:stackoverflow.com/questions/12933724/…

标签: .net


【解决方案1】:

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

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

【讨论】:

  • 好吧字符串本身太大了我想知道字符串是否可以写得更短。由字母、数字和符号组合而成
  • @Power-Mosfet:同样,如果不限制您的域,这是不可能的。长度为nstring 实例比长度小于n 的实例多。
  • intput = "stackoverflow.com";输出=“81c74c7a”;输入 = "stackoverflow.com";输出=“b98a0a9a”;
【解决方案2】:

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

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

【讨论】:

  • 没有“足够长”的长度来保证唯一性。
  • 您可以通过选择更长的哈希值来使概率任意小。一旦它小于硬件错误的概率就足够了。加密安全的 128 位哈希就足够了,但在 Base64 中大约有 22 个字符。
【解决方案3】:

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 是个坏主意,因为该算法可以改变破坏strings 和ints 之间的任何映射。
【解决方案4】:

Jason 说的很对——你不能创建一个长度可以任意长的字符串的有限大小的唯一散列。我向您提交,您要查找的不是哈希,而是compression algorithm on short strings

【讨论】:

  • 请注意,相同的逻辑适用于无损压缩算法。一定有一些字符串的“压缩”版本比字符串本身长。
猜你喜欢
  • 2010-12-20
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多