1. ホーム
  2. javascript

[解決済み] JavaScriptでUUIDを生成する際の衝突について

2023-02-02 04:27:32

質問

これは この質問 . 私は以下のコードを使用しています この答え から、JavaScriptでUUIDを生成するために以下のコードを使用しています。

'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
    return v.toString(16);
});

この解決策はうまくいっているように見えましたが、衝突が発生しています。以下は、私が持っているものです。

  • Google Chrome で動作する Web アプリケーション。
  • 16人のユーザー。
  • これらのユーザーによって、過去 2 か月で約 4000 の UUID が生成されています。
  • 約20件の衝突がありました - たとえば、今日生成された新しい UUID は約 2 か月前と同じでした (別のユーザー)。

この問題の原因は何でしょうか、また、どのように回避すればよいでしょうか。

どのように解決するのですか?

私の最良の推測は Math.random() が何らかの理由で壊れているのだと思います (奇妙に聞こえますが)。これは、衝突が発生したという報告を私が見た最初のものです。

node-uuid には テストハーネス があり、それを使ってそのコード内の 16 進数の分布をテストすることができます。 の中に、あなたが使っているUUIDの実装を代入してみてください。 Math.random() メソッドに置き換えてみて、それでも良い結果が得られるかどうか見てみましょう。

[更新:ちょうど見たところ Veselinのレポート のバグについて uuid() のバグについてです。 問題は起動時のみであるため、起動時に Math.random() のテストは役に立ちそうにありません。devoluk.comのリンク先でより詳しくコメントします]。