Javaのプログラム開発で、絶対に重複しない値が必要な場合「UUID」を利用することが可能です。
本記事では、UUIDとは何なのかといった基本的な概要から実際の生成方法までご紹介していきます。
目次
UUIDとは
UUIDは、ソフトウェア上でオブジェクトを一意に識別するための識別子です。
「Universally Unique Identifier」の略称で、世界中で唯一の値(ユニークな値)となります。
概要
UUIDの概要については、Wikipediaに下記のように記述されています。
UUIDは128ビットの数値だが、16進法による550e8400-e29b-41d4-a716-446655440000というような文字列による表現が使われることが多い。元来は分散システム上で統制なしに作成できる識別子として設計されており、したがって将来にわたって重複や偶然の一致が起こらないという前提で用いることができる。
「重複や偶然の一致が起こらない前提」と記述されていますが、天文学的な数値でしか重複は起こり得ないため、一般的な利用用途では完全な一意の値が生成出来るとの認識で問題ないでしょう。
使い方
UUIDは、必ず一意の値として定義したい場合に利用することが可能です。
例えば、同一パスに大量の一時ファイルを吐き出し利用する場合などが挙げられます。
JavaでUUIDを生成する方法
Javaのプログラム開発でUUIDを利用したい場合には「randomUUID」メソッドを利用することが可能です。
「java.util.UUID」クラスより提供されているメソッドです。
基本構文
randomUUIDの利用方法は非常に簡単で、下記のように記述します。
UUID.randomUUID();
実行すると下記のような値が出力されます。
b783d64f-a16c-4928-a718-94f027c35fe1
randomUUIDメソッドの返却値
randomUUIDメソッドの返却値はUUID型として返却されます。
UUID uuid = UUID.randomUUID();
文字列として扱いたい場合には、「toString」メソッドを使用して文字列変換を行います。
String uuid = UUID.randomUUID().toString();
JavaでUUIDを生成する具体的なサンプル
ここまででUUIDの生成方法を確認出来たので、具体的なサンプルでも確認してみましょう。
今回は同一パスに対して生成したファイル名を、UUIDで生成した値を使って指定するサンプルです。
サンプルコード
100件分のランダムなファイル名を付与して、「tmp」フォルダにテキストファイルを生成するサンプルです。
import java.io.File; import java.io.IOException; import java.util.UUID; public class Main { public static void main(String[] args) { for (int i = 0; i < 100; i++ ) { File file = new File("./tmp/" + UUID.randomUUID() + ".txt"); try { file.createNewFile(); } catch(IOException e) { e.printStackTrace(); } } } }
実行結果
$ ls $ ls 02f27438-5463-461f-b7b1-81ff21fe8b5b.txt 0430d5d9-0e56-4471-b84f-286117ec2223.txt 0605815a-eb8d-4c0b-8457-234499a0ecd9.txt 07912de8-f1cb-445c-ac8d-76a5a69372c2.txt 0bf188d0-630c-4d14-899a-7f81e5ac6cdf.txt 0d272112-4496-4cfa-9c42-9d9a446e78c7.txt 0d2c45e8-099f-4f10-bfd6-d7430386c6df.txt 0e5a6b03-7d82-4234-b69d-e2a2ab7cc51f.txt 0ea4e14b-90b3-4dca-ab85-875ae00e5fb1.txt 0ed2415e-cd5e-4e85-8470-834a990de7ed.txt 中略 fc99846a-93ca-4c1c-b7f0-e1c9f8005ea4.txt fcc2975c-920a-4a98-a4a2-f0d5f1655fff.txt fd17221d-9c5d-4219-aaae-c9a8965a52fe.txt fdeff7d1-5d2c-4ee7-a879-da1d6d6ee2ce.txt fe3e70f2-7b4d-4537-9a1f-03fe151bffc3.txt $
上記結果のように、ファイル名が重複することはなく、1,000件でも10,000件でもそれ以上でも重複することはありません。
Javaで重複しない値を生成したいならUUIDを利用するのが確実
プログラム開発では、一意のデータとして判別させたいというケースが頻繁に起こります。
よく利用される方法に「日時(timestamp)」や「Math.random」メソッドを利用するケースが挙げられます。
これらの方法でも重複する確率はかなり低いのですが、UUIDと比較すると確率は高くなってしまいます。
日時(timestamp)の利用
timestampを利用して、日時で一意の値として扱っているプログラムもたくさんありますが、日時の場合は重複する確率があります。
他の誰かが同一日時で同じ処理を実行することも考えられなくはないですよね。
ミリ秒単位で設定している場合、発生率はかなり低いですが、実際に起こり得るくらいには高い確率で発生します。
Math.randomメソッドの利用
JavaのMathクラスで「random」メソッドを利用することでも不規則な数値を生成することが出来ます。
Main.java
public class Main { public static void main(String[] args) { System.out.println(Math.random()); } }
実行結果
0.2627025405863418
このような出力結果となり、ほとんど重複する可能性はありません。
一般的なプログラムであれば要件を満たせるとも考えられますが、一意の値を担保するような利用用途として提供されているわけではないため、 UUIDを利用した方が確実ということです。
さいごに: JavaのrandomUUIDメソッドを活用して一意な値を生成しよう
本記事では、UUIDの基本情報からJavaで利用可能なrandomUUIDメソッドの使い方についてご紹介してきました。
一意の値を生成する方法には、厳密さにもよりますが記事内でも紹介したように様々な方法が用いられます。
ただ厳密に重複させたくない場合には、一意の値を生成することを目的として提供されている「ramdomUUID」の利用をぜひ検討してみましょう。
サンプルプログラムのため、ファイルへの書き込み処理は行っていません。