Преобразование SecureRandom и UUID в int (Java)? - PullRequest
0 голосов
/ 27 августа 2010

У меня проблемы с получением строки (имя человека) и возвращением уникального целого числа, она продолжает проходить через функцию catch, и я не знаю, почему, кроме написанного мной, SecureRandom не работает, ноэто очень запутанно.Я очень новичок в программировании, поэтому, пожалуйста, будьте добры!

  public static int uinqueID(String name){
    try{
      SecureRandom srA = SecureRandom.getInstance(name);
      Integer randomA = new Integer(srA.nextInt());
      System.out.println(randomA);
      UUID uuidA = UUID.randomUUID();
      String randomNum2 = uuidA.toString();
      System.out.println(randomNum2);
      int randomB = Integer.valueOf(randomNum2);
      int uniqueID = randomA + randomB;
      return uniqueID;
    } catch(NoSuchAlgorithmException e) {
      System.err.println("I failed");
    }
    return -1;
  }

Вывод, который я получаю: Я не смог -1

Спасибо за вашу помощь!

Ответы [ 4 ]

1 голос
/ 27 августа 2010

Вы не можете использовать имя человека, чтобы получить объект SecureRandom. Ожидается имя в реализации генератора случайных чисел. Вы можете использовать «SHA1PRNG», так как это доступно по умолчанию. Затем вы можете заполнить генератор случайных чисел с помощью name.getBytes () и затем получить следующее случайное число.

Из Javadoc:

публичная статическая SecureRandom getInstance (алгоритм String) выдает NoSuchAlgorithmException Создает объект SecureRandom, который ... snip ...

Параметры: алгоритм - название алгоритма PRNG . См. Приложение A в Спецификации и справочнике API криптографической архитектуры Java для получения информации о стандартных именах алгоритмов PRNG.

Возвращает: новый объект SecureRandom. Броски: NoSuchAlgorithmException - если алгоритм PRNG не доступен в среде вызывающего. Поскольку: 1.2

Остальные можно пропустить, потому что хэш так же хорош, как алгоритм, и добавление в него других вещей вряд ли сделает его более безопасным.

что-то вроде:

static int getUUID(String name) throws NoSuchAlgorithmException {
    SecureRandom srA = SecureRandom.getInstance("SHA1PRNG");
    srA.setSeed(name.getBytes());
    return new Integer(srA.nextInt());
}

Я бы обычно использовал MessageDigest, но должен признать, что это довольно сложно.

0 голосов
/ 12 января 2011

А как же:

    static final long getUUID() throws NoSuchAlgorithmException {
        SecureRandom srA = SecureRandom.getInstance("SHA1PRNG");
        srA.setSeed(RandomUtils.nextLong());
        return new Long(srA.nextInt());
    }


    static final String getFixedLengthUUID() {
      try {
        return Long.toHexString(Math.abs(getUUID())) + Long.toHexString(Math.abs(getUUID()));
      } catch (Exception e) {
        return null;
    }
}

Это распечатывает числа с 16 символами:

3fc2ce6b4da08fe0
3fba60e0b8387c58
78cb09b976b112d3
3c28f91c473e29ba
203af64d1e747af6
4934d0b4342b8f30
3b576a97ba8f857
76d49522cecc5c4
5cf650ed72a55b50
1e89acfb4a4589f3
0 голосов
/ 27 августа 2010

Если вы хотите отобразить строку на число, вам нужна хеш-функция или дайджест. Посмотрите на java.security.MessageDigest

0 голосов
/ 27 августа 2010

Согласно документам, NoSuchAlgorithmException выбрасывается

... когда запрашивается конкретный криптографический алгоритм, но он недоступен в среде.

Вам нужно указать алгоритм генератора случайных чисел (RNG) для getInstance(String algorithm), а не имени человека.

Если вам просто нужно случайное число, попробуйте заменить эту строку в вашем коде на

SecureRandom srA = new SecureRandom();

Если вам все равно, насколько случайным является число, и вы просто пытаетесь создать уникальное целое число для имени, тогда я думаю, что все, что вам нужно, это позвонить по номеру hashCode .

...