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

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

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

我希望它能够相当快。

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

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

谢谢。

有帮助吗?

解决方案

如果不需要统计随机,可以将时间戳提供给 MD5 并截断哈希值。主要问题是我不知道这是否是主观的。其他哈希算法可能效果更好。

其他提示

我建议最简单的事情就是花时间 jrand48. 。就像是

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

它是可逆的(216·x+n=0x5deece66d·(232+1)·t+0xb mod 248 ⇒ t=0xdfe05bcb1365·(216·x+n-0xb) 模 248 其中 n ∈ [0,216)) 但由于它是 48 位中的高 32 位,所以实际上不太容易。(您可以申请 jrand48x 也不止一次;只要你不应用它248-1 次,相同类型的属性将保持。)

我建议查看 POSIX 兼容的 drand48() 函数族。他们给出了体面的(但肯定不是加密的)随机数,并且 srand48() 采用 32 位种子值。它们是确定性的,因此重复使用给定的种子将再次重新生成相同的数字序列。

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

如果您不关心它的可逆性,您可以对每个时间戳进行 crc32 处理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top