我有一些数据来自数据源的转储,其中字符串自然键很长(最多60个字符)并且与最终用户无关。我在网址中使用此密钥。这会使网址太长而且用户不友好。
我想将字符串键转换为具有以下要求的整数:
源数据集将随时间而变化。
ID应为:
每次都从头开始重建数据库,因此我不记得已经分配的ID,并将新数据集与现有ID匹配,并为添加的密钥生成顺序ID。
目前有大约30000个不同的密钥,并且该套装不断增长。
如何实现将字符串键映射到整数ID的函数?
我的想法:
1.
内置string.GetHashCode:
ID(key) = Math.Abs(key.GetHashCode())
1.1
“重新散列”内置的GetHashCode,直到生成唯一ID以防止冲突。
2.
一个完美的散列函数
3.
转换为36/64 / ??
还有其他选择吗?
答案 0 :(得分:1)
Base64编码的sha1sum是27个字符。 base64(md5(...))是22个字符。任何较小的,你都会有不可忽视的碰撞风险。
当输入组发生变化时,无法实现完美的散列函数。
答案 1 :(得分:1)
如果您可以保留已分配ID的列表,则只能这样做。
对于实际为您提供当前集的唯一ID的任何给定算法,不保证任何新值都能获得唯一ID。
字符串包含大约400位信息,因此要获得保证唯一的整数,它必须包含字符串中的所有信息,大约为400位。这是一个120个字符,以十进制数表示,因此不会比现在的短。
答案 2 :(得分:0)
设置第二个持久数据库并将KEY / ID对存储在那里。确保您在表格中也有数据的日期,这样您就可以做一些内务管理。