【发布时间】:2012-03-18 03:37:30
【问题描述】:
我有一个代码应该从客户端获取唯一字符串(例如,“d86c52ec8b7e8a2ea315109627888fe6228d”)并返回大于 2200000000 且小于 5800000000 的整数。重要的是,生成的 int 不是随机的,它应该是一对一的唯一的字符串。在不使用 DB 的情况下生成它的最佳方法是什么?
现在看起来像这样:
did = "d86c52ec8b7e8a2ea315109627888fe6228d"
min_cid = 2200000000
max_cid = 5800000000
cid = did.hash.abs.to_s.split.last(10).to_s.to_i
if cid < min_cid
cid += min_cid
else
while cid > max_cid
cid -= 1000000000
end
end
【问题讨论】:
-
没有办法保证小于值空间的键空间中的数字的唯一性。您可以期望的最好结果是碰撞的机会相对较小。此外,您的算法存在一些缺陷,因为您通过将 220000000 添加到低于您的百万的哈希值中引入了额外的冲突可能性,这将与映射到该新值的东西发生冲突。
-
好的,为特定设备生成最大的特定数字集很重要,它不会随时间改变。碰撞不是什么大问题,但碰撞越少越好。
标签: ruby string random integer