是否存在一种算法,可以有效地将 uint32 转换为不同的 uint32,并在给定可变的随机种子时产生 1:1 的映射?
我对此的初步方向是一种算法,其中种子以某种方式表达数字中要重新排列的位(这样 0000 0101 就变成了 0100 1000,种子为 [0->6, 2->3]),但我不确定如何生成一种有效地进行混洗的方法。
一些限制:
- 生成从种子进行改组的算法不需要非常快
- 实际上,对 uint32 执行 shuffle 应该很快
- 对于给定的种子,输出中不应有重复(唯一的 uint32 产生唯一的 uint32)
如果主要目标是将 [0..N] 范围内的所有整数映射到同一范围内的任意唯一整数,那么有一种快速、众所周知的方法可以做到这一点:乘法逆。
大约 10 年前,Eric Lippert 写了一篇关于它的博客文章,演示了它的工作原理。这是他的“从头开始的数学”系列的一部分。这是关于乘法逆元的两篇文章中的第一篇:https ://ericlippert.com/2013/11/12/math-from-scratch-part-thirteen-multiplicative-inverses/
该算法需要一次性计算一些系数,但随后计算任何数字的倒数只需进行几次乘法运算。它很快。
当我需要混淆连续键时,我会使用此算法。例如,第一个注册的用户获得用户 ID 1。在内部是这样。但他看到的用户 ID 可能是 1879632。下一个用户 ID 在内部是 #2。但每个人看到的外部用户 ID 是 5034832。
该操作是可逆的。给定顺序 ID(即“1”),您可以生成显示的用户 ID(11879632)。并且,给定显示的用户 ID,您可以得出顺序 ID。
我还写了一篇博客文章来展示如何使用它。