Как получить 32 бита Уникальный номер в Java?
Вопрос
Мне нужно создать уникальное количество 32 битов в Java. Мне нужно вернуть номер как java int, который требуется интерфейсом. Можете ли вы поделиться некоторыми идеями на этом?
Номер будет использоваться в качестве MySQL PK, а несколько потоков могут быть созданы собственный уникальный идентификатор одновременно. (Извините, это решительно не использовать MySQL Incremental ID)
Я попробовал UUID-класс, но кажется, что данные, которые он генерирует, имеет больше битов, чем я могу использовать.
Я нашел это, но не уверен, работает ли это:
// seems no way to get int
UUID id = UUID.randomUUID();
System.out.println(id);
// not working either?
java.rmi.server.UID uid = new java.rmi.server.UID();
System.out.println(uid.toString());
// the one i am using
SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");
prng.setSeed(System.currentTimeMillis());
int ret = prng.nextInt();
System.out.println(ret);
Решение
Как «уникальные» вы хотите? Короче говоря, что такое домен столкновения? Если вы имеете дело с тысячами ключей, то тогда Random.nextint () Точно делает именно то, что вы хотите по отношению к тому, что вы пытались с версией 4 UUIDS (UUID V4 генерирует 128 случайных битов).
Если вам нужно что-то с меньшей вероятностью столкновения, то вам нужно иметь глобально увеличенное целое число, но здесь много заботятся о том, что удерживайте состояние между запусками JVM. Для этого вы должны посмотреть в Atomicantegers.
Другие советы
То SecureRandom
Подход в порядке, но не устанавливайте на него семя. Он выберет свое собственное семя в (предположительно) безопасным способом.
Вы также можете использовать UUID и просто отказаться от битов, которые вам не нужно, например,
int key = (int)UUID.randomUUID().getLeastSignificantBits();
Редактировать: Вы также должны знать, что SecureRandom
значительно медленнее, чем Random
. Отказ Так как вы не делаете Crypto здесь, почему бы не использовать Random
?
Я думаю, что вы можете использовать 32-битный хэш-функцию. Детали приведены в следующем руководствеhttp://www.concentric.net/~ttwang/tech/inthash.htm.
private static int hash(int key){
key = ~key + (key << 15); // key = (key << 15) - key - 1;
key = key ^ (key >>> 12);
key = key + (key << 2);
key = key ^ (key >>> 4);
key = key * 2057; // key = (key + (key << 3)) + (key << 11);
key = key ^ (key >>> 16);
return key;
}