我需要一个算法,它几乎会将一个unix时间戳变成一个合适的随机数,所以如果我“回放”时间戳,我会得到相同的随机数。
这就是我的意思:
我希望它相当快。
到目前为止,我的想法是反复播种PRNG,但我不确定这是否是处理此问题的最佳方法。
非常感谢任何想法和想法。
感谢。
答案 0 :(得分:2)
如果不需要统计随机,可能会将时间戳提供给MD5并截断哈希值。主要问题是我不知道这是否是完全的。其他散列算法可能会更好。
答案 1 :(得分: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位,实际上并不太容易。 (您可以多次将jrand48
应用于x
;只要您不应用它2 48 -1次,相同类型的属性将保持不变。 )
答案 2 :(得分:0)
我建议查看符合POSIX标准的drand48()
系列函数。它们提供了不错的(但肯定不是加密的)随机数,srand48()
获取了32位的种子值。它们是确定性的,因此重用给定的种子将再次重新生成相同的数字序列。
答案 3 :(得分:0)
(timestamp ^ 0x12345678) + 12345678
这是否足够微妙?
如果你不关心它的可逆性,你可以每个时间戳crc32。