🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Q&A

解決済

4回答

8237閲覧

ランダムの文字列が偶然一致する可能性

退会済みユーザー

退会済みユーザー

総合スコア0

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

0グッド

1クリップ

投稿2019/09/28 01:21

例えばコメントの投稿などに個別に投稿IDをランダム文字列をつけるとするとこれらが偶然一致する可能性も考えたほうがいいのでしょうか?
ちなみに文字列は計算上280兆個できます。
もちろん先に出てしまった文字列が少なければ一致しないかどうか確認しても良いとは思いますが今回の場合多くなってしまいそうなため質問させていただきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fukatani

2019/09/28 01:48

一つの文字列の長さはどれだけでしょうか? 文字列には数字、英語小文字、大文字、特殊文字の内、なにがふくまれますか?
guest

回答4

0

誕生日問題ですね。

UUIDの衝突確率 - Qiitaの記事を参考にすると

1 * (1 - 1/2.8e14) * (1 - 2/2.8e14) * ... * (1 - (n - 1)/2.8e14) ≈ 1 - Math.exp(- n**2 / (2.8e14 * 2))

と言う形で計算できるようです。

1万件なら約0.000018%
10万件なら約0.0018%
100万件なら約0.18%
1000万件なら約16%
1億件なら約100%

厳密な計算は検証していませんが、100万件を超えるぐらいなら、ソシャゲでレアガチャひいてお目当てのものをあてるぐらいの確率ですし、衝突することはあってもおかしくないぐらいの確率だと思います。

投稿2019/09/28 02:31

raccy

総合スコア21737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

重複する可能性を完全に排除できる乱数なんてものは存在しないと思わなければいけません。
6面サイコロを転がして同じ数字が連続する可能性は、2連続で1/36、3連続で1/216です。
これはサイコロになんらイカサマのない、各面の出る確率が完全に均等(1/6)の場合です。

いわゆる「疑似乱数」の場合、実はこれが1/6になっていないため、特定の条件下では確率が跳ね上がってしまいますから。

まぁ仮に疑似ではなく真正な乱数だとしても、280兆個の文字列に対して最初の100個の中に重複が存在する可能性は排除できないわけなので、ユニークIDに乱数を用いるのはダメでしょう。

単純に連番にしたらどうですか?
前提条件が示されていないのであれですが、データをMySQL等データベースに格納するのであれば、
bigint unsignedであれば1~18446744073709551615、1844京6744兆737億955万1615件の投稿まで、絶対に重複しないIDを付与できます。
これは世界中の人間(70億人)全員が毎日100件ずつ投稿(1日7000億投稿)したとして約72200年ほど枯渇しません。

投稿2019/09/28 02:23

Take_it

総合スコア357

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/09/28 02:40

連番なら絶対重複しないので、私もこれに賛成です。ランダムっぽい文字列が必要なら、この数値をバイト列にした後暗号化して BASE64 でテキスト化する手もあります。
kyoya0819

2019/09/28 12:35

自分も同様にこれが最も適した方法だと思います。 > これは世界中の人間(70億人)全員が毎日100件ずつ投稿(1日7000億投稿)したとして約72200年ほど枯渇しません。 iPv6みたい...
guest

0

idを重複を考慮せずランダムに生成するというのは避けるべきです。
どのような乱数を使うかわかりませんが、ほとんどの場合は擬似乱数の周期性を持っているため、ランダムのつもりでも重複してしまう可能性があります。

投稿2019/09/28 01:56

gnbrganchan

総合スコア438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

利用目的次第かと。

ユニーク id であれば当然一致は排除すべきです。

投稿2019/09/28 02:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問