0

我有一些数据定期作为来自数据源的转储,其字符串自然键很长(最多 60 个字符)并且与最终用户无关。我在 url 中使用这个键。这使得 url 太长并且对用户不友好。

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

源数据集将随时间变化。

该 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/??

  • 没有足够短的长键

还有哪些其他选择?

4

3 回答 3

1

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

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

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

于 2010-04-17T07:39:39.277 回答
1

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

当输入集发生变化时,完美的散列函数是不可能的。

于 2010-04-17T07:15:41.050 回答
0

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

于 2010-04-17T07:17:57.800 回答