乱数ジェネレータをシードするための最も安全なエントロピーのソースは何ですか?この質問は言語とプラットフォームに依存せず、ネットワーク上のすべてのマシンに当てはまります。理想的には、クラウド環境のマシンまたはホスティング会社が提供するサーバーで利用可能なソースを探しています。
注意すべき重要な弱点が2つあります。乱数ジェネレータを送信するために時間を使用すると、 CWE-337 に違反します。小さなシードスペースを使用すると、 CWE-339 に違反します。
ここにいくつかの考えがあります。せっかちな場合は、最後に結論に進んでください。
1。安全なシードとは何ですか?
セキュリティは、攻撃モデルに対してのみ相対的に定義されます。ここでは、攻撃者に関するエントロピーがnビットのnビットのシーケンスが必要です。簡単に言えば、可能なすべて2んそのシーケンスの値は、攻撃者の観点からも同様に可能性があります。
これは、攻撃者が利用できる情報に関連するモデルです。シードを生成して使用するアプリケーション(通常はPRNG内)は正確なシードを知っています。種子が「安全」であるかどうかは、種子の絶対的な特性ではなく、種子生成プロセスの絶対的な特性でもありません。重要なのは、攻撃者が生成プロセスに関して持っている情報の量です。このレベルの情報は、状況によって大きく異なります。例えばマルチユーザーシステム(たとえば、Unixのような、アプリケーションのハードウェアによる分離)では、メモリアクセスの正確なタイミングにより、名目上保護されたプロセスがメモリを読み取る方法に関する情報を明らかにできます。リモートの攻撃者でもこのような情報を入手できます。これは 実証済み (ラボ条件で)AES暗号化(通常のAES実装はキーに依存するアクセスパターンで内部テーブルを使用します。攻撃者はキャッシュミスを強制し、応答の正確なタイミングを通じてそれらを検出します)サーバー)。
シードの寿命を考慮する必要があります。シードは、攻撃者が知らない限り安全です。このプロパティはその後も成り立つ必要があります。特に、後続のPRNG出力の抜粋からシードを回復することはできません。理想的には、ある時点で完全なPRNG PRNG事前に生成されたビットについては、手がかりを提供しません。
ここで私が言いたいのは、シードが「安全」であることは、それが安全性を維持できるコンテキストで使用された場合のみであり、多かれ少なかれ暗号的に安全であることを意味しますPRNGおよびいくつかの改ざん耐性のあるストレージ。そのようなストレージが利用可能な場合、最も安全なシードは、ずっと前に生成されたonceのシードであり、安全なPRNG改ざん防止ハードウェアによってホストされています。
残念ながら、そのようなハードウェアは高価であり(HSMと呼ばれ、数百または数千ドルのコストがかかります)、そのコストは通常正当化が困難であることが証明されます(悪いシードはシステムの動作を妨げません;これはテスト不能性の通常の問題です)セキュリティの)。したがって、「ほとんどがソフトウェア」のソリューションを採用するのが通例です。ソフトウェアは長期的な機密ストレージを提供するのが得意ではないため、シードの寿命は任意に短縮され、新しいシードが定期的に取得されます。 Fortuna では、そのような再シードは、生成された疑似ランダムデータのメガバイトごとに少なくとも1回発生すると想定されています。
要約すると、HSMがないセットアップでは、安全なシードは、攻撃者が収集できないデータを使用して比較的簡単に(かなり頻繁に行うため)取得できるシードです。
2。ミキシング
ランダムデータソースは、ナイスユニフォームビットを生成しません(各ビットは正確に0.5の確率で値1を持ち、ビット値は互いに独立しています)。代わりに、ランダムソースはソース固有のセットで値を生成します。これらの値はビットのシーケンスとしてエンコードできますが、価値のあるお金は得られません。エントロピーのnビットを得るには、エンコードされたときにはるかに多くを使用する値が必要ですnビット。
ここで使用する暗号化ツールは [〜#〜] prf [〜#〜] であり、任意の長さの入力を受け入れ、nを生成しますビット出力。この種の暗号で保護されたPRFは ランダムOracle としてモデル化されます。つまり、特定の入力のOracle出力について、それを試さずに予測することは、計算上実行可能ではありません。
現在、 ハッシュ関数 があります。ハッシュ関数は、いくつかのセキュリティプロパティ、つまり、プリイメージ、2番目のプリイメージ、および衝突に対する耐性を満たさなければなりません。通常、ランダムなOracleモデルからどのように逸脱するかを確認することにより、ハッシュ関数を分析します。ここで重要な点があります。ランダムなOracleモデルに従うPRFは優れたハッシュ関数ですが、ランダムなOracleと簡単に区別できる優れたハッシュ関数(前イメージと衝突への抵抗という意味で)が存在する可能性があります。 。特に、 SHA-2 関数(SHA-256、SHA-512 ...)は安全であると見なされますが、「長さ拡張攻撃」(与えられたh(m)、部分的に制約されたメッセージh(m || m ')を計算することができますm 'わからないm)。長さ拡張攻撃は、プリイメージまたは衝突の作成へのショートカットを提供していないようですが、それらのハッシュ関数がランダムなオラクルではないことを示しています。 SHA-3競争 について、NISTは候補者がそのような「長さの延長」を許可すべきではないと述べました。
したがって、混合ステップは簡単ではありません。最善の策は、今のところ、SHA-256またはSHA-512を使用し、選択されたときにSHA-3に切り替えることです(これは2012年中頃に発生するはずです)。
3。ソース
コンピュータは確定的なマシンです。ランダムさを得るには、物理的な世界のいくつかの測定結果を混ぜ合わせる必要があります。
哲学的な注記:ある時点で、実験着を着たり、基礎研究を行うために報酬を受け取ったりするような、賢い人を信頼する必要があります。 SHA-256などのハッシュ関数を使用する場合、実際には多数の暗号技術者から信頼を得ています。ガイガーカウンターで崩壊する放射性物質を使用すると、次のような物理学者を信頼していることになります。次のatomカーネルがいつオフになるかを予測する方法を真剣に検討しましたが、その特定のケースでは、「物理学者」はベクレル、ラザフォード、ボーア、またはアインシュタインなどの人々を含み、「本当のハード」は「1世紀以上の蓄積された研究」を意味するため、あなたは正確に未踏の領域にいるわけではないことに注意してください。しかし、安全に対する信頼はまだ少し残っています。
一部のコンピューターには、ランダムデータを生成するハードウェアがすでに含まれています(つまり、物理学者が知る限り、十分にランダムな物理プロセスを使用および測定します)。 VIA C3(x86互換CPUのライン)には、そのようなハードウェアがあります。30年前の家庭用コンピュータであるCommodore 64にも、ハードウェアRNGが搭載されていました(または、 Wikipedia 、少なくとも)。
特別なハードウェアを除いて、あなたはあなたが得るかもしれないあらゆる物理的なイベントを使わなければなりません。通常、キーストローク、受信イーサネットパケット、マウスの動き、ハードディスクアクセスなどを使用します。すべてのイベントにはデータが含まれており、測定可能な瞬間に発生します(最新のプロセッサは、サイクルカウンターのおかげで非常に正確なクロックを持っています)。これらの瞬間、およびイベントデータの内容は、エントロピーソースとして蓄積できます。これは、アプリケーションよりもオペレーティングシステム自体(ハードウェアに直接アクセスできる)の方がはるかに簡単なので、シードを収集する通常の方法は、オペレーティングシステムに問い合わせることです(Linuxでは、これは/dev/random
または/dev/urandom
と呼ばれます[どちらにも利点があります]と問題、あなたの毒を選択してください]; Windowsでは、CryptGenRandom()
)を呼び出します。
極端なケースは、1.2より前のJavaアプレット、Java.security.SecureRandom
を追加する前です。Javaは、アプリケーションコードをハードウェアから分離するのに非常に効果的です。ランダムシードは困難な課題でした。通常の解決策は、2つまたは3つのスレッドを同時に実行し、スレッド切り替えを激しく行うことで、1秒あたりのスレッド切り替えの数がいくぶんランダムになるようにしました(事実、これは、 OSスケジューラーのアクションは、ハードウェア関連のイベントを含め、マシンで何が発生するかによって異なりますが、これは非常に不十分でした。
時間に関連する対策の問題は、攻撃者が現在の時刻を知っていることです。攻撃者がマシンへのアプリケーションアクセスを持っている場合、攻撃者はサイクルカウンターも読み取ることができます。
一部の人々は、アンプを最大に設定することにより、オーディオカードを「ホワイトノイズ」の発生源として使用することを提案しました(今日でもサーバーはオーディオを持っています)。他の人たちは、ウェブカメラに電源を入れることを主張しています(ウェブカメラのビデオは「うるさい」ので、ウェブカメラが壁に面している場合でも、ランダム性に適しています)。しかし、ウェブカメラを備えたサーバーは一般的ではありません。また、外部ネットワークサーバー(www.google.com
など)にpingを実行して、戻ってくるまでにかかる時間を確認することもできます(ただし、これは攻撃者がネットワークをスパイすることで確認できます)。
ハッシュ関数を使用した混合ステップの優れた点は、エントロピーが蓄積されることだけです。データがそれほどランダムでなくても、データを追加しても害はありません。ハッシュ関数を使用して、できるだけ多くのものを入力します。ハッシュ関数は非常に高速で(良いSHA-512実装は、シングルコアを使用して、典型的なPCで150 MB/s以上を処理します)、シードはそれほど頻繁には起こりません。
4。結論
[〜#〜] hsm [〜#〜] を使用します。彼らは数百ドルまたは数千ドルの費用がかかりますが、あなたの秘密はそれよりはるかに価値がありますか? HSMにはRNGハードウェアが含まれており、PRNGアルゴリズムを実行し、改ざん防止機能を備えたシードを保存します。また、ほとんどのHSMはすでにさまざまな国内規制(FIPS米国では140、ヨーロッパではEALレベル)。
HSMを購入しないほど安い場合、または実際にはあまり価値のないデータを保護したい場合は、ハッシュで取得したシードを使用して、暗号的に安全なPRNGを構築しますlotsの物理的測定値。一部のハードウェアからのデータは、そのデータが取得された瞬間(「サイクルカウンター」を読み取る)とともにハッシュする必要があります。ここではメガバイトですが、もっといいのは、そうするしないだけです。オペレーティングシステムが提供する機能を使用するだけで、すでにそのようなコードが含まれています。
最も安全なシードは、最高レベルのエントロピー(または予測できないビット数のほとんど)を持つシードです。エントロピーが小さいため、時間は一般的に悪いシードです(つまり、トランザクションがいつ発生したかがわかっている場合は、タイムスタンプを数ビット以内に推測できます)。ハードウェアエントロピーソース(減衰プロセスなど)は、シードのビットごとに1ビットのエントロピーを生成するため、非常に優れています。
通常、ハードウェアソースはほとんどのニーズに実用的ではないため、低品質のエントロピーソースをいくつか混合して、より高いエントロピーソースを生成する必要があります。通常、これは、各サンプルのエントロピーのビット数を推定し、十分なサンプルを収集して、エントロピーソースの検索スペースが十分に大きいため、攻撃者が検索するのが実用的でない場合に行われます(128ビットが良い経験則です) )。
使用できるソースは次のとおりです:マイクロ秒単位の現在の時間(通常、解像度と攻撃者が簡単に推測できる1/2ビットの非常に低いエントロピー)、UIイベントの到着時間など。
/ dev/randomやWindows CAPI乱数ジェネレータなどのオペレーティングシステムソースは、多くの場合、これらの低エントロピーソースの事前混合ソースを提供します。たとえば、Windowsジェネレータ CryptGenRandom には次のものが含まれます。
一部のPRNGには、低品質のソースからのエントロピーを混合して高品質の結果を生成できるようにする組み込みの戦略があります。非常に優れたジェネレータの1つは Fortuna ジェネレータです。特に、エントロピーソースのいずれかが侵害された場合のリスクを制限する戦略を使用します。
最も安全なシードは真にランダムなシードであり、これを使用することにより、今日の実際のコンピューティングシステムで近似することができます。
ワンタイムパッドの興味深い見方として、スパイ活動をしているときはいつでも、数文字だけをやり取りする必要があるシステムがあります。たとえば、前回、グランドフェンウィック公国にトースターを作るための秘密の計画を売っていたとき、ささやく必要がありました。
enonH
南軍に。彼女は http://is.Gd/enonH- を取得することを知っていました(これは、is.Gd拡張ページに移動する「安全な」エキスパンダーURLであり、完全にSFW画像を指します。カエル)。これにより、409kビットのワンタイムパッドが得られました。「enonH」をささやきながらウィンクすると、画像のハッシュを取得して次の送信のデコードキーとして使用することがわかっています。
ent で報告されているように、JPEG画像は圧縮されているため、エントロピーの比較的良いソースになる傾向があります。
$ ent frog.jpg
エントロピー= 7.955028ビット/バイト。最適な圧縮では、この51092バイトのファイルのサイズが0%減少します。
51092サンプルのカイ二乗分布は4409.15であり、ランダムにこの値を0.01%の確率で超えます。
データバイトの算術平均値は129.0884(127.5 =ランダム)です。
パイのモンテカルロ値は3.053435115(エラー2.81パーセント)です。
シリアル相関係数は0.052738です(完全に無相関= 0.0)。無相関= 0.0)。
それを、私が彼女に向けたほとんど推測不可能なイメージと組み合わせて、私の秘密のトースター計画はザ・マンから安全です。
答えはLinuxマシンでは/dev/random
です。これは「実際の」乱数ジェネレータに非常に近く、エントロピープールが枯渇すると/dev/urandom
することができます PRNGによって生成されます。以下の引用は Linuxカーネルのrandom.c からの引用です。このファイル全体は、美しく、たくさんのコメントです。コード自体はPGPから採用されたものです。その美しさはCの制約に拘束されません。これは、アクセサによってラップされたグローバル構造体によってマークされています。これは単に畏敬の念を起こさせるデザインです。
このルーチンは、デバイスドライバーなどから環境ノイズを収集し、暗号化の使用に適した適切な乱数を返します。明白な暗号化の使用に加えて、これらの番号はシードTCP=シーケンス番号、およびランダムであるだけでなく攻撃者が予測するのが難しい番号を持つことが望ましい他の場所にも適しています。
動作理論
コンピュータは非常に予測可能なデバイスです。したがって、それは非常に難しいです
コンピュータで真に乱数を生成する---とは対照的に
疑似乱数。これは、
アルゴリズム。残念ながら、攻撃者が疑似乱数ジェネレータのシーケンスを推測するのは非常に簡単です。
アプリケーションこれは受け入れられません。そのため、代わりに、コンピューターの環境から「環境ノイズ」を収集する必要があります。これは、外部の攻撃者が観察するのが困難であり、それを使用して乱数を生成する必要があります。 Unix環境では、これはカーネル内から行うのが最適です。環境からのランダム性のソースには、キーボード間が含まれます
タイミング、一部の割り込みからの割り込み間のタイミング、および(a)非決定的であり、かつ(b)外部の観測者にとって測定が困難な他のイベント。これらのソースからのランダム性は「エントロピープール」に追加され、CRCのような関数を使用して混合されます。これは暗号的に強力ではありませんが、ランダム性が悪意を持って選択されていないことを前提として十分であり、割り込みごとにそれを行うオーバーヘッドが非常に合理的であるほど十分に高速です。ランダムバイトがエントロピープールに混合されると、ルーチンは乱数発生器の内部状態に格納されているランダム性のビット数の推定値を保持します。ランダムバイトが必要な場合は、SHAを使用して取得します。
「エントロピープール」の内容のハッシュ。 SHAハッシュは、エントロピープールの内部状態の公開を回避します。SHAの入力に関する有用な情報をその出力。SHAを巧妙な方法で分析することが可能であっても、ジェネレーターから返されるデータの量が、
プール、出力データは完全に予測不可能です。このため、ルーチンは、乱数を出力するときに、エントロピープールに含まれる「真のランダム性」のビット数の内部推定を減らします。この推定値がゼロになった場合でも、ルーチンは乱数を生成できます。ただし、攻撃者は(少なくとも理論的には)以前の出力からジェネレータの将来の出力を推測できる可能性があります。これには、SHAの暗号解読の成功が必要ですが、これは実現可能とは考えられていませんが、可能性はわずかです。それにもかかわらず、これらの数値は大部分の目的に役立つはずです。...
インターネットラジオクライアントを作成し、ブロードキャストからランダムなサンプルを使用します。選択したり、フォールバックしたりするためのいくつかのステーションのプールを用意します。
暗号理論に目を向けると、最も安全なシードは無秩序なイベントによって生成されるものであることが明らかになります。最近の歴史を通じて、秘密の操作は "One-time pad" として知られているものを利用してきました。通常、これらはどこにもない場所に散らばっているさまざまな大気のリスニングポストを通じて生成されます。大気ノイズは、ランダムであると見なされるほどに無秩序です。この方法の主な問題は、ワンタイムパッドのロジスティクスがかなり大きいことです。
あなたへの私の提案は、どういうわけかデータを抽出するのに十分に無秩序なイベントを見つけることです。
ジェームズは正しいです。さらに、ランダムなデータを提供する購入可能なハードウェアがあります。どこで見たのかはわかりませんが、一部のサウンドカードにはそのようなハードウェアが付属していることを読んだと思います。
http://www.random.org/ のようなサイトを使用することもできます
4-非常にランダムなサイコロの目で選ばれます。 :-)
Random.org は真の乱数ジェネレーターを提供します Webサービス 、大気ノイズによって「シード」されます。
毎日200,000のランダムビットを無料で取得できます。その後、最大100万のランダムビットキャップまで、アカウントにチャージする必要があります。1ドルあたり400万ビットと同じくらい安くなります。
わかりました。クライアントに強力なシードが必要であり、ここでクラウドコンピューティングを使用していると仮定すると、いくつかのハードウェア乱数ジェネレーターのソリューションがここにあります。
http://en.wikipedia.org/wiki/Hardware_random_number_generator
したがって、これは、各クライアントが公開/秘密鍵のペアを持っていることを想定しており、サーバーは各クライアントの公開鍵を知っています。鍵を生成するには、最初はPGPで行われたものと同様のものを使用できます。最初は、誰かがタイプするときのキーストローク間の時間の違いを推測できません。
したがって、クライアントは乱数のリクエストを送信します。サーバーはハードウェアジェネレータを使用し、公開鍵で暗号化し、サーバーの秘密鍵で署名します。その後、クライアントはそれがどこから来たかを確認し、それを復号化できます。
これにより、乱数を生成して安全な方法で戻すことができます。
UPDATE:
あなたの最善の策は、Art of Computer Programmingまたは任意のNumerical Methodsの本を調べるか、ブルース・シュナイアーがこれらのリンクのように書いたものを見ることです http://www.schneier.com/blog/archives/2006/06/random_number_g.htmlhttp://www.cryptosys.net/rng_algorithms.htmlhttp: //www.schneier.com/blog/archives/2006/06/random_number_g.htmlhttp://www.schneier.com/blog/archives/2006/06/random_number_g.html ソフトウェアでの乱数生成の提案 ftp://ftp.rsasecurity.com/pub/pdfs/bull-1.pdf
Crypto ++に生成を行わせる方法、または少なくともWei Daiがどのように実行したかを確認することもできます http://www.cryptopp.com/
コンセンサスは暗号的に強力であるため、ハードウェアから乱数を導出する必要があります。一部のプロセッサはこの機能を備えています(Intelチップは他のものと同様)。また、サウンドカードを使用して、A-Dコンバーターの低ビットの変動を測定することもできます。
しかし、ハードウェアのニーズにより、言語やプラットフォームに依存しない答えはありません。ほぼすべての大きなOSは、安全な乱数をサポートします。また、プール内の残りのエントロピーを追跡する必要があるため、優れた出力を備えた優れた乱数ジェネレーターを実装するのは難しいです。
したがって、最初のステップは、使用する言語を決定することです。強力な乱数をサポートしているものもあります。そうでない場合は、世代を抽象化して、プラットフォームに依存する乱数ソースを呼び出す必要があります。
中間者は認証されていないオンラインソースにとって深刻な脅威になる可能性があるため、セキュリティニーズによっては「オンライン」ソースにうんざりしています。
random.org を使用して、インターネット上の誰にでも真の乱数を提供すると主張し、HTTP APIも備えている使える。彼らは無料と有料の両方のサービスを提供しています。
免責事項: 私はrandom.orgとは何の関係もありません
あなたの最も安全な方法は自然から来ます。つまり、コンピューターシステムの外部で発生し、そのパターンを予測する能力を超えた何かです。
たとえば、 暗号化された安全なPRNG を研究する多くの研究者は、放射性崩壊をモデルとして使用し、他の研究者はフラクタルなどを調べます。真のRNGを作成する の既存の手段があります
PRNGを実装するための私のお気に入りの方法の1つは、コンピュータとのユーザー対話からのものです。たとえば、この投稿は、過去の一連の投稿からのフォワードエンジニアリングによって事前に決定できるものではありませんでした。 。画面上にマウスを置いた場所が非常にランダムですが、作成された軌跡もランダムです。ユーザーインタラクションから見るのはランダムです。特定の数値を生成するなどの特定の入力を提供する手段の悪用は、「スウォーム」を使用して軽減できます。ユーザー入力の 'および'計算 'は、システムにすべてのユーザーがイブとしていない限り、問題ありません。数値のプールはユーザーに正比例するため、これは多くのアプリケーションに適していません入力。これを実装するには、それ自体に問題がある可能性があります。
RNGに関心のある人は、すでに次のようなことをしています。
安全な種子は自然に由来します。
編集:あなたが見ていることに基づいて、私はあなたのクラウドサーバーのEDGの集約を使用することを提案するかもしれません。
Linuxでは、答えは/ dev/randomです(Windowsでは同等のものはCryptGenRandと呼ばれます)。
ただし、クラウド環境では、/ dev/randomが大幅に使い果たされる可能性があり、要求に答えるのに十分なエントロピーがない可能性があります。
その問題を解決するために、当社は数千のサーバーと(= Originの)良い乱数を同時に提供できる真の乱数ジェネレーターアプライアンスを開発し、VMを同時にインストールします。アプライアンスがクラウドデータセンターのLANで必要なのは、マシンで実行されているデーモンだけです。このデーモンは、/ dev/randomエントロピーレベルを監視し、エントロピーが必要な場合はアプライアンスに(ネットワーク経由で)リクエストを送信し、受信したランダムデータをカーネルのエントロピープール。
当社のソリューションについて詳しく知りたい場合は、当社のウェブサイト(www.sqrtech.com)にアクセスするか、info @ sqrtech.comまでお問い合わせください。
ジュリアン
最初に、乱数ジェネレータの実際の使用/目的を定義する必要があります。なぜ、非常に高いセキュリティ基準に合格する必要があると思いますか?私が尋ねる理由は、あなたができることからそれを選ぶことを述べたということです-あなたが本当にセキュリティ目的でそれを使用しているなら、それを送るためにソースとチャンネルを保護することは誰の学問的なニットピックよりもはるかに重要です。
2番目の要素は、必要な実際の乱数のサイズです。大きなシードが適していますが、生成された数も大きい場合のみです。それ以外の場合は、生成された数値の小さな部分を読み取るだけで、リスクが高まります。
SHAまたはAESなど)ではなく、再構成可能な暗号を調べてください。これらがどのようにそしてなぜ機能するかを読んで確認したい場合は、次の2つの研究論文をご覧ください。
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.97.6594&rep=rep1&type=pdfhttp://www.springerlink.com/index/ q29t6v1p45515186.pdf
または、ネット上で見つけた再構成可能なGOST暗号ソースコードを入手して、基本的なシード(連結された「ティッカー」とWebサーバーノードID(Webファーム内にある場合)など)に応答の一部をフィードするか、常にトップニュースを変更するインターネットニュースサイト、または高度に制御された初期シード(独自に作成可能)をフィードし、軽い擬似ランダムシーケンスを使用してさらに暗号構成を選択できます。さらにNSAそれを壊すことはできません:-)それは常に異なる暗号であるためです。実際の暗号化の目的では、検証のためにシーケンスを複製できるようにするために、事実上、非常に制御された初期シードを使用する必要があります。最初の項目-ソースとディストリビューションの保護。
追加のランダムハードウェアが利用できない場合の簡単な解決策。
ミリ秒、mouseXおよびmouseYを使用してシードを生成します。
これはIS推測です!暗号化オタクは、私が間違っている場合は修正してください
この時点でのUUID/GUIDの公式アルゴリズムは、暗号化ハッシュ関数を介して実行される結果を返します-時間、mac addr、カウンターなどの既知の情報を取得してUUID/GUIDを形成し、これを暗号化によって実行しますハッシュを使用して、MACアドレスを抽出できないようにします。
XORこれはシードに必要なビット数まで可能であり、結果の値が目的のビット数で定義された数の空間に均等に分散されることをかなり適切に保証できます。注これが安全であるとは主張していませんが、このアクションは、時間の経過とともにビットスペース全体に均等に分散する値を生成する必要があるだけです。
(((PI X現在のスレッドID)X現在のプロセスID)/ティック数)x pi