Javaでランダム文字列を生成したい場面は多くあります。
例えば以下のような用途です。
-
一時パスワードの発行
-
トークンやセッションIDの生成
-
サンプルデータの作成
-
ファイル名や識別子を一意にしたい場合
本記事では、英数字のみ、記号含むパターン、暗号学的に安全なランダム生成(SecureRandom) など、実務でよく使うパターンをまとめて解説します。
1. もっとも基本:英数字のランダム文字列を生成する方法
使用例が多い標準的パターン(Random)
特徴
-
英数字のみのシンプルな生成
-
速度は速く、軽量
-
ただし暗号用途には不向き(後述の SecureRandom を使うべき)
2. 記号付き(パスワード想定など)のランダム生成
記号を含めたい場合は、使う文字セットを拡張するだけで対応できます。
例:記号も含めた 20 文字のランダムパスワード
3. 暗号用途は必須:SecureRandom を使う安全な方法
API キー、トークン、認証系のランダム値は必ず SecureRandom を使用します。
特徴
-
暗号学的に強い乱数
-
セッションID・APIキーなどの用途で必須
-
若干処理は重くなるが実用上問題なし
4. UUID を使って簡単に一意文字列を生成する
ランダム性というより「ほぼ衝突しない文字列」がほしい場合に便利です。
特徴
-
標準APIだけで手軽に使える
-
衝突確率が極めて低い
-
記号(ハイフン)が含まれる
-
32文字固定で、用途によっては長すぎることもある
5. Apache Commons Lang を使う(実務で人気)
ライブラリに頼れる環境なら、最もスマートで保守性が高い方法です。
依存関係(Maven)
使用例
記号含めたい場合
6. Java 8 Streams を使うシンプルな書き方
ラムダでスッキリ書きたい時のパターンです。
特徴
-
Java 8 以降で動作
-
1行で文字列生成ロジックを完結できる
-
SecureRandom との併用が安心
7. 用途別のおすすめ
| 用途 | 推奨方法 | 理由 |
|---|---|---|
| 一時パスワード | Random or SecureRandom(長め) | 記号含めて複雑にできるため |
| APIキー / トークン | SecureRandom | 暗号用途で必須 |
| テストデータ生成 | Random | 十分高速で簡単 |
| 重複しないID | UUID | 手軽で安全 |
| コードの保守性重視 | Apache Commons Lang | チーム開発で人気 |
まとめ
Javaでは目的に応じて、複数のランダム文字列生成方法が選べます。
-
Random:軽量でテストデータに最適
-
SecureRandom:セキュア用途の必須選択
-
UUID:一意性が重要な場合
-
Commons Lang:コードの可読性・保守性が高い
-
Streams:Java 8 以降でスマートに書ける
実務では SecureRandom と UUID を組み合わせれば、ほとんどの要件を満たせます。
