1

我需要一种算法,它几乎可以将 unix 时间戳转换为适当的随机数,这样如果我“回放”时间戳,我就会得到相同的随机数。

这就是我所说的适当的意思:

  1. 大多数人不会在随机数中检测到循环或模式。
  2. 它不需要是密码安全的。
  3. 所有数字都必须能够生成。(我发现 LFSR 不这样做)
  4. 数字是 32 位整数

我希望它相当快。

到目前为止,我的想法是一遍又一遍地播种 PRNG,但我不确定这是否是处理这个问题的最佳方法。

任何想法和想法将不胜感激。

谢谢。

4

4 回答 4

2

如果它不需要在统计上是随机的,也许将时间戳提供给 MD5 并截断散列。主要问题是我不知道这是否是主观的。其他散列算法可能会更好。

于 2009-11-07T04:58:03.277 回答
1

我建议最简单的做法是将您的时间花在jrand48上。就像是

#include <stdlib.h>
int mix(int t) {
    unsigned short x[3] = {t, t<<16, t};
    return jrand48(x);
}

它是可逆的 (2 16 ·x+n≡0x5deece66d·(2 32 +1)·t+0xb mod 2 48 ⇒ t≡0xdfe05bcb1365·(2 16 ·x+n-0xb) mod 2 48其中 n∈[0,2 16 )) 但由于它是 48 位中的高 32 位,实际上并不容易。(您也可以多次申请jrand48x只要您不申请 2 48 -1 次,相同类型的属性将成立。)

于 2009-11-07T06:45:57.433 回答
0

我建议查看符合 POSIXdrand48()的函数系列。它们给出了不错的(但肯定不是加密的)随机数,并srand48()采用 32 位种子值。它们是确定性的,因此重用给定的种子将再次重新生成相同的数字序列。

于 2009-11-07T05:29:01.253 回答
0

(timestamp ^ 0x12345678) + 12345678这够微妙吗?

如果你不关心它的可逆性,你可以 crc32 每个时间戳。

于 2009-11-07T06:09:02.470 回答