如何将字符串键映射到唯一的整数ID?

时间:2010-04-17 07:12:48

标签: c# hash unique uniqueidentifier identifier

我有一些数据来自数据源的转储,其中字符串自然键很长(最多60个字符)并且与最终用户无关。我在网址中使用此密钥。这会使网址太长而且用户不友好。

我想将字符串键转换为具有以下要求的整数:

源数据集将随时间而变化。

ID应为:

  • 非负整数
  • 即使输入键组改变也是唯一且恒定的
  • 最好是可逆的回到关键(不是强烈的要求)

每次都从头开始重建数据库,因此我不记得已经分配的ID,并将新数据集与现有ID匹配,并为添加的密钥生成顺序ID。

目前有大约30000个不同的密钥,并且该套装不断增长。

如何实现将字符串键映射到整数ID的函数?

我的想法:

1.内置string.GetHashCode:

ID(key) = Math.Abs(key.GetHashCode())

  • 不保证是唯一的
  • (不可逆)

1.1“重新散列”内置的GetHashCode,直到生成唯一ID以防止冲突。

    如果将某些冲突添加到输入数据集的开头,则
  • 现有ID可能会更改

2.一个完美的散列函数

  • 如果输入集改变
  • ,我不确定这是否可以生成常量ID
  • (不可逆)

3.转换为36/64 / ??

  • 不会缩短长按键

还有其他选择吗?

3 个答案:

答案 0 :(得分:1)

Base64编码的sha1sum是27个字符。 base64(md5(...))是22个字符。任何较小的,你都会有不可忽视的碰撞风险。

当输入组发生变化时,无法实现完美的散列函数。

答案 1 :(得分:1)

如果您可以保留已分配ID的列表,则只能这样做。

对于实际为您提供当前集的唯一ID的任何给定算法,不保证任何新值都能获得唯一ID。

字符串包含大约400位信息,因此要获得保证唯一的整数,它必须包含字符串中的所有信息,大约为400位。这是一个120个字符,以十进制数表示,因此不会比现在的短。

答案 2 :(得分:0)

设置第二个持久数据库并将KEY / ID对存储在那里。确保您在表格中也有数据的日期,这样您就可以做一些内务管理。