コメントを残すこんにちは、ヒューマンクレストの磯部です。今回はランダム文字列の衝突確率について考察します。自動テストを運用する際に、意外に何度も実務で使ったことがあるので書いてみました。Uniq制約があったら、みなさんはどう対応されているでしょうか。アカウント名を自由入力で登録できるけれども、アカウント名の重複は許さないというような仕様があったとします。アカウント登録は回帰テストとして、テスト実行毎に行いたいという想定です。それが出来ないことも多いです。連番をつけるという手もありますが、自動テストの停止・再実行や、並列実行などの際に、悲しいことが色々起こります。いった場合、私はテスト実行毎にランダム文字列を生成して対応することにしています。衝突とはさて、ランダム文字列生成は、ランダムなので、たまたま同じ文字列が生成されてしまう確率が0ではありません。ランダムに生成した文字列同士が一致することを衝突と呼びます。生成したランダム文字列の衝突が起こると、Uniq制約に引っかかり、自動テストが(テスト対象に問題がないにも関わらず)失敗してしまうことになります。できるだけ避けたい事態です。ランダム文字列の桁数や文字種を増やせば、衝突確率が減るのは直感的にお判りかと思います。数字10種だけよりアルファベット25文字のほうが、4桁よりは8桁のほうが、衝突確率は減りそうですね。どれくらいの桁数・文字種を確保しておけば、十分に衝突確率を下げられるのでしょうか。確率計算の方法については、興味が分かれるかと思いますので、結果だけ記載しておきます。b:文字種の数、d:桁数、n:試行回数、P:衝突確率とすると、以下になります。2進数の場合の、試行回数から衝突確率を近似値で計算したのが以下の表です。桁数を計算してみました。それぞれ、文字種は以下として計算しています。英数字のように文字種が多い場合は、思いのほか少ない桁数で衝突を回避できそうなことが判ります。6桁を採用することが多いです。以下のように生成した文字列を、入力文字列に付加しています。base[rand(base.length)]}.joinend自動テストからずいぶん遠いところに来ましたが、いかがでしたでしょうか。みなさまの業務その他に、ご参考になれば幸いです。TweetQuesとは?Quesとは、Software品質保証に関わるQAエンジニアの活性化を目的としたQA専門のイベントです。Software品質保証に関わるQAエンジニアの方が、会社間の垣根を越えて、情報交換や交流を深めてもらう事で、日本のSoftware品質保証を盛り上げていく場にしたいと思います。(2)主催:協賛:運営:。