我有一些数据定期作为来自数据源的转储,其字符串自然键很长(最多 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/??
- 没有足够短的长键
还有哪些其他选择?