来自32位自动递增INTEGER的伪随机数

时间:2011-06-13 09:43:11

标签: math random

我在数据库中有一个自动递增32位整数主键的表,它将产生1-4294967295范围内的数字。

我想保留自动生成的主键的便利性,同时在应用程序的前端使用我的数字看起来像是随机生成的。

是否有一个数学函数允许在整数和另一个整数之间进行双向一对一转换?

例如,函数将获取一个数字,并将其转换为另一个数字:

1 => 1538645623
2 => 2043145593
3 =>  393439399

还有另一个功能:

1538645623 => 1
2043145593 => 2
 393439399 => 3

我不一定在这里寻找一个实现,而是一个我想的暗示,必定是一个众所周知的数学问题:)

3 个答案:

答案 0 :(得分:6)

数学上这与加密几乎完全相同。

你:我想从一个id(比特串)转到另一个数字(比特串),然后以非显而易见的方式再次返回。 密码学:我想以明显的方式从明文(比特串)转到另一串比特然后再回来(可逆)。

因此,对于一个简单的解决方案,我是否可以建议只使用您的语言插入最方便的加密算法,并加密和解密您的ID?

如果你想要更聪明一点,除了加密之外你还可以做所谓的“腌制”。把你的id作为32位(或其他)数字。用随机的32位数字连接它。加密结果。要反转,只需解密,然后扔掉随机部分。

当然,如果某人正在严重攻击这个问题,那么这可能容易受到已知的明文/差分密码分析攻击的影响,因为你有一个非常小的已知明文空间,但听起来你并没有试图抵御严重的攻击。 / p>

答案 1 :(得分:2)

首先删除1的偏移量,这样就可以得到0到2 32 -2范围内的数字。设m = 2 32 -1。

选择与a相关的一些m a * a' = 1 (mod m)。因为它是相对素数,所以它具有倒数''使得b。还要选择一些y = (a * x + b) % m。选择大数字以获得良好的混音效果。

然后,您可以按x = ((y - b) * a') % m计算所需的伪随机数,然后按a取回原始数据。

这基本上是伪随机数的线性同余生成器(LCG)的一步。

请注意,这不安全,只是混淆。例如,如果用户可以按顺序获得两个号码,那么他可以轻松地恢复b和{{1}}。

答案 2 :(得分:0)

在大多数情况下,Web应用程序使用随机生成的数字的哈希作为表行的引用。此哈希可以存储为数字并显示为最终用户的字符串。

这个哈希是唯一的,它是标识符,id只在应用程序本身使用,从不向外界显示。

相关问题