1. ホーム
  2. java

[解決済み] JAVAでUUID文字列を効率的に生成する方法 (UUID.randomUUID().toString()からダッシュを取り除いたもの)

2022-03-13 18:06:44

質問

一意なバイト列を生成する効率的なユーティリティが欲しいです。UUIDは良い候補ですが UUID.randomUUID().toString() のようなものが生成されます。 44e128a5-ac7a-4c9a-be4c-224b6bf81b20 というのは良いのですが、ダッシュのない文字列の方が良いですね。

英数字のみからランダムな文字列を生成する効率的な方法を探しています(ダッシュやその他の特殊記号は含まれません)。

どのように解決するのですか?

結局、UUID.javaの実装をベースに自分で何か書くことにしました。なお、私は UUIDを生成しない 代わりに、私が考えた最も効率的な方法で、ランダムな32バイトの16進文字列を作成します。

実装

import java.security.SecureRandom;
import java.util.UUID;

public class RandomUtil {
    // Maxim: Copied from UUID implementation :)
    private static volatile SecureRandom numberGenerator = null;
    private static final long MSB = 0x8000000000000000L;

    public static String unique() {
        SecureRandom ng = numberGenerator;
        if (ng == null) {
            numberGenerator = ng = new SecureRandom();
        }

        return Long.toHexString(MSB | ng.nextLong()) + Long.toHexString(MSB | ng.nextLong());
    }       
}

使用方法

RandomUtil.unique()

テスト内容

動作確認のためにテストした入力の一部です。

public static void main(String[] args) {
    System.out.println(UUID.randomUUID().toString());
    System.out.println(RandomUtil.unique());

    System.out.println();
    System.out.println(Long.toHexString(0x8000000000000000L |21));
    System.out.println(Long.toBinaryString(0x8000000000000000L |21));
    System.out.println(Long.toHexString(Long.MAX_VALUE + 1));
}