我需要一种算法,它几乎可以将 unix 时间戳转换为适当的随机数,这样如果我“回放”时间戳,我就会得到相同的随机数。
这就是我所说的适当的意思:
- 大多数人不会在随机数中检测到循环或模式。
- 它不需要是密码安全的。
- 所有数字都必须能够生成。(我发现 LFSR 不这样做)
- 数字是 32 位整数
我希望它相当快。
到目前为止,我的想法是一遍又一遍地播种 PRNG,但我不确定这是否是处理这个问题的最佳方法。
任何想法和想法将不胜感激。
谢谢。
如果它不需要在统计上是随机的,也许将时间戳提供给 MD5 并截断散列。主要问题是我不知道这是否是主观的。其他散列算法可能会更好。
我建议最简单的做法是将您的时间花在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 位,实际上并不容易。(您也可以多次申请jrand48
;x
只要您不申请 2 48 -1 次,相同类型的属性将成立。)
我建议查看符合 POSIXdrand48()
的函数系列。它们给出了不错的(但肯定不是加密的)随机数,并srand48()
采用 32 位种子值。它们是确定性的,因此重用给定的种子将再次重新生成相同的数字序列。
(timestamp ^ 0x12345678) + 12345678
这够微妙吗?
如果你不关心它的可逆性,你可以 crc32 每个时间戳。