【问题标题】:Pseudo-random numbers from a 32-bit auto-increment INTEGER来自 32 位自增 INTEGER 的伪随机数
【发布时间】:2011-06-13 09:43:10
【问题描述】:

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

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

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

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

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

还有另一个功能:

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

我不一定要在这里寻找一个实现,而是我认为的一个提示,一定是某个地方的一个众所周知的数学问题:)

【问题讨论】:

  • @Tomalak:避免人们试图猜测下一个数字是什么。不如随机一个,但目前正在考虑几种可能性!
  • @Benjamin:你为什么要避免人们猜测下一个数字是什么?混淆在很大程度上是一种浪费。
  • 如果你真的想走这条路,那么你可以乘以一个大数字。这解决了问题(没有随机元素,但谁会知道)。我没有把它作为答案,因为我认为这是一个糟糕的解决方案。
  • 也许问题中并不清楚,但数字必须保持在相同的 32 位范围内。此外,给定两个连续的数字,乘法将很容易猜出这些东西是如何工作的!
  • @Tomalak,这不是白费力气。这是为了保护系统免受试图欺骗它的人的侵害。每个数字都会被人工面对面核对,所以不会有太多作弊尝试,除非数字顺序对用户来说是显而易见的。

标签: math random


【解决方案1】:

从数学上讲,这与密码学几乎完全相同。

你:我想从一个 id(位串)转到另一个数字(位串),然后以一种不明显的方式再次返回。 密码学:我想以一种不明显的方式从明文(位串)到另一个位串并再次返回(可逆)。

因此,对于一个简单的解决方案,我是否可以建议插入在您的语言中最方便的任何加密算法,并加密和解密您的 id?

如果你想更聪明一点,除了密码学之外,你还可以做所谓的“加盐”。将您的 id 作为 32 位(或其他)数字。将它与一个随机的 32 位数字连接起来。加密结果。要反转,只需解密,并丢弃随机部分。

当然,如果有人严重攻击它,这可能容易受到已知的明文/差分密码分析攻击,因为你的已知明文空间非常小,但听起来你并没有试图防御严重的攻击。

【讨论】:

  • 非常有建设性的回答,谢谢。确实,它与密码学非常相似!
  • 这是密码学的众多应用之一,它不仅仅是传输秘密消息。
【解决方案2】:

先去掉1的偏移量,得到0到232-2范围内的数字。设 m = 232-1.

选择一些与m 相对质数的a。因为它是相对素数,所以它有一个逆 a',所以 a * a' = 1 (mod m)。也选择一些b。选择大数字以获得良好的混合效果。

然后你可以通过y = (a * x + b) % m计算你想要的伪随机数,然后通过x = ((y - b) * a') % m取回原来的。

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

请注意,这是不安全的,它只是混淆。例如,如果用户可以依次得到两个数字,那么他可以轻松恢复ab

【讨论】:

  • 哇,我印象深刻!正是我一直在等待的那种答案。实现起来可能有点复杂,但真的很有趣。
【解决方案3】:

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

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

【讨论】:

  • 问题是散列只是单向(你不能从散列中取回数字),在我的情况下,数字必须保持较短(将手动输入),因此我们不能依赖于(例如 MD5)哈希不太可能发生冲突的事实。没有一对一的相关性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 2021-03-16
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
相关资源
最近更新 更多