一意なランダム文字列を作成する際には、 UUID をよく使うと思います。
衝突しない(する可能性が限りなく低い)ランダム文字列を作成できる V4 を使うことが多いと思いますが、 V5 との違いも知っておきたいですね。
結論だけ知りたい人向け
UUID v4とv5の最大の違いは、v4が完全にランダムな値に基づき生成されるのに対し、v5は特定の入力値(名前と名前空間)に基づいて一貫して生成される点です。
UUID のバージョン4 (v4) とは
UUID v4はランダムに生成されます。
このバージョンのUUIDは、128ビットの長さを持ち、その内の一部がバージョン情報(この場合は4)で、残りのビットがランダムに生成されるという仕組みです。
これにより、衝突(同じUUIDが再生成される確率)は非常に低くなるので、安心して一意な文字列として使用できます。
使用場面としては、このような時に使います。
- 一意性が必要で、特定の識別子に依存しない場合
- システム間で共有する必要がない一時的な識別子を生成する場合
- 安全性が重要な場合(ランダム性により予測が困難)
サンプルコード(Python)です。
import uuid
# UUID v4の生成
uuid_v4 = uuid.uuid4()
print(f"UUID v4: {uuid_v4}")
私の自作ツールサイトでも生成できます。 ぜひご利用ください。
UUID のバージョン5(v5)とは
UUID v5は名前ベースのUUIDであり、SHA-1ハッシュアルゴリズムを使用して生成されます。
特定の「名前」(たとえばURLやユーザー名など)と「名前空間」(UUIDの形式で表される)を組み合わせて、常に同じ入力に対して同じUUIDを生成するのが特徴です。
ランダム文字列を生成するという点では v4 と同じですが、 v5 は、たとえばユーザID を入力とした場合は、毎回同じ UUID が生成されることになります。
使用場面としては、このような時に使います。
- 特定のリソースを一意に識別する必要がある場合
- 同じ入力値から一貫して同じUUIDを生成したい場合
- システム間で共有する識別子を生成する場合
サンプルコード(Python)です。
import uuid
# 名前空間(DNSを例とする)
namespace = uuid.NAMESPACE_DNS
# 名前ベースでUUID v5を生成
uuid_v5 = uuid.uuid5(namespace, "example.com")
print(f"UUID v5: {uuid_v5}")
私の自作ツールサイトでも生成できます。 ぜひご利用ください。
UUIDのバージョン5(v5)の名前空間の種類
UUID v5では、特定の「名前」と「名前空間」を組み合わせてUUIDを生成します。
名前空間はあらかじめ定義されたUUIDで、以下の種類があります。
- DNS
ドメイン名システムに基づく名前空間。
例えば、
example.com
のようなドメイン名を使用します。 - URL
統一資源ロケータ(URL)に基づく名前空間。
例えば、
http://example.com
のようなURLを使用します。 - OID オブジェクト識別子(Object Identifier)に基づく名前空間。
- X.500 X.500識別子(通常はDN、すなわち識別名)に基づく名前空間。
これらの名前空間は、特定のタイプの識別子に基づいて一貫性のあるUUIDを生成するために使用されます。
サンプルコード(Python)です。
import uuid
# DNS名前空間でUUID v5を生成
uuid_v5_dns = uuid.uuid5(uuid.NAMESPACE_DNS, "example.com")
print(f"UUID v5 (DNS): {uuid_v5_dns}")
# URL名前空間でUUID v5を生成
uuid_v5_url = uuid.uuid5(uuid.NAMESPACE_URL, "http://example.com")
print(f"UUID v5 (URL): {uuid_v5_url}")
参考
おわりに
UUID はどの言語でも使用する機会がありそうなので覚えておきたいですね。
コメント