FlutterのUUID v4が衝突する問題

FlutterでUUID v4が衝突するという問題に遭遇したので調べた。

UUID生成はこのパッケージが一般的。書いている時点ではバージョン4.4.0

uuid | Dart package

このパッケージはいくつかの乱数生成方法があるが、READMEにある通りにやると、MathRNGが使われる。

dart-uuid/lib/rng.dart at main · daegalus/dart-uuid · GitHub

MathRNGのコードを見ると、Dartの標準ライブラリMath.Randomが使われている。

sdk/sdk/lib/math/random.dart at main · dart-lang/sdk · GitHub

3.5.0時点でのRandomの実際の実装はおそらくこれ。

sdk/runtime/vm/random.cc at main · dart-lang/sdk · GitHub

multiply with caryという32ビット周期のアルゴリズム、らしい。

それなりに使われてる言語の標準ライブラリはmersenne twisterかそれより何かいいやつなんだろうと勝手に思っていたが、現在でもそうじゃないのあるのか。os側の乱数生成器を使うオプションとか用意してるから気にしてない?

乱数としては何となく短そうな気がしないでもないが、UUID v4生成1回に128ビット消費してるから30ビット周期で約10億回で衝突する?

そこまで大量に生成してる気もしないが、これで衝突してるのかなあ。