每次从我的数据库中获取10个随机ID

问题描述

我一次需要10个随机ID。每次我要求一个新的ID时,我都需要获得一组新的随机ID,但是新ID必须不包括我先前要求新的ID时已经获得的任何ID。 。我的数据库中可能总共有100个或100万个ID。我打算使用ID在网页上显示10个项目,以及下一个和上一个按钮。如果用户返回到先前显示的任何页面,则已经显示页面必须与显示的原始项目一致

我有一个想法,我选择带有种子的1000次随机数,将其存储在Redis服务器上,并在用户进入页面时每10行弹出一次。有什么不同的想法吗?

解决方法

您正在寻找可重复的随机排序。在MySQL中,您可以通过将种子作为explained in the documentation传递给数学函数rand()来实现:

对于相等的参数值,RAND(N)每次都返回相同的值,从而产生可重复的列值序列。

这为您提供了前10条记录:

select t.*
from mytable t
order by rand(12345)
limit 10

然后可以分页;要获得“下一个” 10条记录,请对rand()使用相同的种子,然后对结果进行offset

select t.*
from mytable t
order by rand(12345)
limit 10 offset 10
,

对于大量的非重复“随机”数字,使用加密可能更好。如果数字不重复,则它们不是真正随机的,因为它们被限制为不重复。每次选择一个数字,可用数字池都会缩小。因此输出不是真正随机的。

要实施,请设置一个计数器:0、1、2、3,...选择一个常数键。然后使用密钥对计数器进行加密,以获得非重复输出。然后增加计数器准备生成下一个输出。由于加密是可逆的,因此可以保证使用同一密钥的不同输入可以提供不同的输出。加密是一对一的过程。

AES将为您提供128个非重复位,而DES仅达到64位。如果128位不够用,那么您将不得不对更大的分组密码(例如Rijndael)进行一些研究。