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

get 10 random ids every single time from my database

我一次需要 10 个随机 ID。每次我要求一组新的时候我都需要得到一组新的随机 ID,但是新的不能包括我以前多次要求新的时候已经得到的任何一个,除非这个过程被重置.我的数据库中可能总共有 100 或 100 万个 ID。我计划使用 id 在网页上显示 10 个项目,并带有下一个和上一个按钮。如果用户返回任何先前显示的页面,则已显示的页面必须与显示的原始项目一致

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

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

for equal argument values, RAND(N) returns the same value each time, and thus produces a repeatable sequence of column values.

这为您提供了前 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

对于大量 non-repeating 'random' 号码,您最好使用加密。如果数字不重复,那么它们就不是真正随机的,因为它们被限制为不重复。每次您选择一个号码时,可用号码池都会缩小。因此输出不是真正随机的。

要实施,请设置一个计数器:0、1、2、3 ...选择一个常量键。然后使用密钥加密计数器以获得 non-repeating 输出。然后递增计数器以生成下一个输出。因为加密是可逆的,所以使用相同密钥的不同输入可以保证提供不同的输出。加密是一个 one-to-one 过程。

AES 会给你 128 non-repeating 位,DES 只能达到 64 位。如果 128 位不够,那么您将不得不对更大的分组密码进行一些研究,例如 Rijndael。