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 ビットなので、実際にはそれほど簡単ではありません。(複数回適用jrand48することもできます。2 48x -1 回適用しない限り、同じ種類のプロパティが保持されます。)

于 2009-11-07T06:45:57.433 に答える
0

(timestamp ^ 0x12345678) + 12345678これは十分に微妙ですか?

可逆性を気にしない場合は、各タイムスタンプを crc32 できます。

于 2009-11-07T06:09:02.470 に答える
0

POSIX 準拠drand48()の関数ファミリを参照することをお勧めします。それらは適切な (ただし暗号化されていない) 乱数を提供srand48()し、32 ビットのシード値を取ります。それらは決定論的であるため、特定のシードを再利用すると、同じ数列が再び生成されます。

于 2009-11-07T05:29:01.253 に答える