web-dev-qa-db-ja.com

数字のみで構成されるランダムなUUIDを生成する方法はありますか?

JavaのUUIDクラスはランダムなUUIDを生成します。しかし、これは文字と数字で構成されています。一部のアプリケーションでは、数字のみが必要です。 Javaで数字のみで構成されるランダムなUUIDを生成する方法はありますか?

UUID.randomUUID();
18
rosh

乱数は必要ないが、番号付きのUUIDは以下を使用するだけの場合:

String lUUID = String.format("%040d", new BigInteger(UUID.randomUUID().toString().replace("-", ""), 16));

この場合、40個のゼロまでパディングされたままになります。

の結果:
UUID:b55081fa-9cd1-48c2-95d4-efe2db322a54
に:
UUID:0241008287272164729465721528295504357972

18
Chris Eibl

Random 数値を生成して、必要な形式に変換しないのはなぜですか?

これは、箱から出してすぐに独自性を与えることはありません。 (つまり、各世代にチェックを実装し、ロジックを再試行する必要があります)

一方、UUIDビットを取得して数値に変換する他のソリューションは、一意性がより細かくなります。ユースケースによっては、このアプローチで一意性を確認することもできます。

6
Jigar Joshi

この質問の元の投稿者は@JigarJoshiの質問をベストアンサーとしてマークしましたが、場合によっては乱数ではなくUUIDを使用する理由があることを付け加えたいと思います。違いは、UUIDは(普遍的に)一意である(したがって名前が付けられている)のに対し、乱数はそうではないということです。乱数を生成するときに同じ番号を2回取得するのか、それとももっと頻繁に取得するのかは確率の問題ですが、これはUUIDでは発生しません。したがって、@ ChrisEiblの回答が最良の回答だと思います。

5
foobar

記録のために:UUIDは実際には128ビット数です。

英数字の文字列として表示されるのは、16進数(0..9A..F)を使用した128ビットの数値の表現です。

実際の解決策は、文字列を対応する128ビット数に変換することです。そして、それを保存するには、2つのLongが必要です(Longは64ビットです)。

4
Pablo Pazos
UUID uuid = UUID.randomUUID();
String numericUUID = Long.toString(uuid.getMostSignificantBits())
                   + Long.toString(uuid.getLeastSignificantBits());
3
jkschneider

UUIDが必要ないのに、なぜUUIDクラスを使用するのですか? Java.util.Randomクラスを使用して実現できる乱数だけが必要なようです。

1
Malax