Вопрос

Мне нужно создать уникальное количество 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;

    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top