結局UUIDは衝突するんですか(主にv4について)

PHP、Laravelを使ったUUID生成における衝突について教えてもらいました。
10
前へ 1 2 ・・ 5 次へ
田中ひさてる @tanakahisateru

@MatsuP8 @mpyw そのライブラリを生で使うなら、時刻や何らかの固有値を利用した形式に対応してるので大丈夫そうです。v4個定はPHPの生uniqid以下ですね。バイト長が合っててそれらしく見えるだけのゴミ、いや初心者騙しの迷惑でしかないですね

2019-10-29 01:09:33
カレー食べたい @mpyw

自分は Laravel では Str::orderedUuid() 使ってました。「件数自体は膨大だけど単位時間あたりに生成されるレコードは最大でも50程度」みたいな前提があるならこっちのほうが衝突しにくいと思ったので

2019-10-29 01:09:51
カレー食べたい @mpyw

あとインデックス効率も優れてます

2019-10-29 01:10:26
カレー食べたい @mpyw

Laravel の notifications テーブルデフォだと Str::uuid() になるけど今たぶん5000万行とかになってる このレベルだと衝突確率無視できないぐらいはあると思う、でも Str::orderedUuid() だとある程度安全

2019-10-29 01:12:54
カレー食べたい @mpyw

あと insert on duplicate key update を頻繁に使う場合は UUID のほうが望ましいです オートインクリメントだとID食いまくるので

2019-10-29 01:19:24
カレー食べたい @mpyw

IDを食いたくなかったらアトミック性は諦めて Model::updateOrCreate() とか使ってください

2019-10-29 01:20:06
田中ひさてる @tanakahisateru

Str::uuid() のことを知って Laravel はやはり悪い文明滅ぼすべきとなった

2019-10-29 01:20:01
田中ひさてる @tanakahisateru

@n_1215 違うんですよ、乱数だからUUIDが衝突する可能性があるって思わせてしまう、ユニバーサルユニークの本当の意味を理解することを阻害してて平気なところが、技術者としてのクソさをあのハゲに見出してしまうんですよ

2019-10-29 01:29:31
田中ひさてる @tanakahisateru

デバイス固有値というと難しいけど、ようするに、グローバルIPアドレスとか、ドメイン名+ロードバランサー番号とか、自分が絶対にユニークだと認識できる要素を含んで、かつ、計算速度より速いタイムスタンプ含めば、論理的にユニークだと言えるし、仮に衝突しても自分で制御可能なんですよ

2019-10-29 02:31:07
田中ひさてる @tanakahisateru

十分に長い乱数はユニークとほぼ等価ってのはいいんですよ。それで事故ってもそれは太陽フレアみたいなものだから、自分で納得して使うぶんには。ただ、UUIDがなぜUUなIDなのかを理解して使う機会を奪うような真似を平気でやってしまうのが、自分さえ良ければ他人はバカでいいと思われてるようで腹立つ

2019-10-29 03:08:58
n @n_1215

UUIDv4をデフォルトにしている教育に悪いフレームワークを滅していこうな

2019-10-29 10:10:32
田中ひさてる @tanakahisateru

軽い気持ちでつぶやいたUUIDがPHPerを震撼させた

2019-10-29 01:36:07
まつぴー @MatsuP8

もうユニークなんて信じられない

2019-10-29 01:41:17
n @n_1215

誤解を招きそうだから擁護しておくと、Str::uuid()からデフォルトで生成されるもの自体はramsey/uuidのライブラリからの直の出力を流しているだけだしおかしいわけではない。普通のUUIDv4。 ただ、グローバルに使えるstaticメソッドを持つStrクラスにstaticな状態が増えてが一歩神に近づいたなってだけ

2019-10-29 10:50:12
n @n_1215

ramsey/uuidのUuidクラスを直に使った方がよっぽどわかりやす……うわなにをするやめろ

2019-10-29 10:51:23
n @n_1215

むしろ初見だとStr::orderedUuid()のほうが得体が知れなくないすか?

2019-10-29 10:52:43
まつぴー @MatsuP8

@n_1215 nさんはUUIDバイナリ化してブチ込むって言ってたのでorderedUuidみたいなのは使わないんですかね

2019-10-29 10:57:53
n @n_1215

@MatsuP8 いや使ったことはあるよ普通に。仕様が独自なところ以外はそこまで問題はないと思う。

2019-10-29 10:59:08
n @n_1215

@MatsuP8 ULIDとか仕様がちゃんと分かっているものを使う方が安心ではある

2019-10-29 11:00:01
n @n_1215

仕様が明記されていないので特性が変わる可能性すらあるかもしれないしねえ

2019-10-29 11:01:27
n @n_1215

UUIDv4に限らずランダムな値を生成するクラスにはちゃんとモックできるようにインターフェースをつけておくんだよってばっちゃが言ってた

2019-10-29 09:32:43

衝突の確率

n @n_1215

30京で1%なので1兆レコード程度のオーダーだとかなり小さいんじゃないすかね。近似式どっかにあるかな

2019-10-29 01:23:13
前へ 1 2 ・・ 5 次へ