我希望生成一个随机数并将其发布到数据库中的表中,以用于特定的user_id.问题是,相同的数字不能使用两次.有一百万种方法可以做到这一点,但我希望非常热衷于算法的人能够在一个优雅的解决方案中巧妙地解决问题,因为满足以下条件:
1)对数据库的查询量最少.2)在内存中进行数据结构爬行的次数最少.
基本上这个想法是做以下事情
1)创建0到9999999之间的随机数
2)检查数据库以查看数字是否存在
或者
2)查询数据库中的所有数字
3)查看返回的结果是否与数据库中的数据匹配
4)如果匹配,重复步骤1,如果没有,问题就解决了.
谢谢.
没有你的算法不可扩展.我之前做的是串行发送数字(每次+1),然后通过XOR操作传递它们来混杂位,从而给我一个看似随机的数字.当然它们并不是随机的,但它们看起来对用户来说是如此.
[编辑]补充资料
这个算法的逻辑是这样的,你使用一个已知的序列来生成唯一的数字,然后你确定地操纵它们,所以它们不再看起来是连续的.一般的解决方案是使用某种形式的加密,在我的例子中是一个XOR触发器,因为它的速度尽可能快,并且它可以保证数字永远不会碰撞.
但是,您可以使用其他形式的加密,如果您想要更加随机的数字,超速(假设您不需要一次生成多个ID).现在,选择加密算法的重点是"数字绝不会碰撞的保证".并且证明加密算法是否能够实现该保证的方法是检查加密的原始数量和结果是否具有相同的比特数,并且该算法是可逆的(双射).
[感谢Adam Liss和CesarB对解决方案的研究]
你为什么不使用GUID?大多数语言应该有内置的方法来执行此操作.它保证是唯一的(具有非常合理的界限).
想要一个过顶的解决方案?
我认为随机性不是加密质量,而是足以阻止用户通过user_id猜测用户的寿命.
在开发期间,以字符串形式生成所有1000万个数字的列表.
(可选)执行一些简单的转换,例如向中间添加常量字符串.(这是为了防止结果过于可预测.)
将它们传递给生成Perfect Hash函数的工具,例如gperf.
生成的代码可用于在运行时将用户的id快速编码为唯一的哈希值,保证不与任何其他哈希值冲突.