質問: UnityのC#でゲームを作っており、 モバイル端末間のデータ引継ぎに関して調査しております。 端末固有のIDを取得または生成したいと考えており、 その過程で件名のGuid構造体を見つけました。 下記、MSDNによると "GUID は、128 ビットの整数 (16 バイト) 一意の識別子が必要であれば常に、 すべてのコンピューターおよびネットワークの間で使用できます。 このような識別子には、重複する可能性は非常に低いができます。" とあるのですが、 "すべてのコンピューターおよびネットワークの間で使用できます。"と いう部分が非常にひっかかっております。 そもそも全端末でほぼ異なる一意なIDがなぜ作れるのか? モバイル間でどのIDが発行されたかを知るにはサーバーサイドなどで アクティベーションを管理していないと不可能だと思うのですが、 ここでいう"すべてのコンピューターおよびネットワークの間で使用できます。"とは どういう意味でしょうか? 以上、よろしくお願いします。 ■環境 Windows10 Unity5.3.5f1 (Unityなので.Netは2.0 C#は3.0だと思われます。)
回答: GUID という用語は Microsoft による UUID の実装のひとつと解釈してOKです。 そして UUID の解説はたとえば 「暗号学的単方向ハッシュ関数」というのは入力が少し違うと結果の値が大きく変わるような関数です。これの入力として各 PC ごとに異なるであろう値 (作成時刻の nsec 値とか MAC アドレスとかキー操作時間エントロピーとか) を渡すと毎回違う値が得られます。これが UUID です。 > > すべてのコンピューターおよびネットワークの間で使用できます。 > > > というのは「まったく無関係なマシンがお互いに連絡を取り合ったりせず独立に UUID を生成するような条件下でも、その UUID が完全一致する可能性が極めて低い」という意味です。 言い換えれば、「自分が今生成した UUID が、過去未来、ネットワークの全マシン上で生成された別の UUID と完全一致する可能性はきわめて低いがゆえに一意の識別子として使えます」です。 極めて低いだけで完全に0ではないよ、と提示 MSDN 解説ページ(の原文)は主張しています (機械翻訳日本語ページより、原文英語ページのほうが意味が理解しやすいです) 。 UUID がたまたま一致する確率は、キー長と誕生日のパラドックスから決まり Wikipedia の解説では 1/(2^61) と書かれています。 厳密さをさておき、ちょっと計算してみましょう。 1秒に1億個の UUID を生成・比較できるマシンが UUID を生成して比較し続けるとします。 1億 = 2^26.57 1年は 365*24*3600 秒なので 2^24.91 61-26.57-24.91 = 9.52 なので 2^9.52 年すなわち 734 年かけると一致することがある。 UUID が一致したら何がどうまずいか?あたりは事前に検討が必要です。 まあ普通に「善意の UUID ユーザが正しく運用すれば」そう簡単に一致はしませんけど、ネットワーク電文を読み取って UUID を手に入れた攻撃者が悪意を持って使ったら?とかは一度考えてもいいでしょう。