2010-08-26 2 views
0

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

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

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

ответ

1

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

Из Javadoc:

общественности статической SecureRandom деЫпзЬапсе (алгоритм String) бросает NoSuchAlgorithmException Создает объект SecureRandom, что ... чик ...

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

Возврат: новый объект SecureRandom. Throws: 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

ок! Это имеет больше смысла, поэтому можно ли использовать имя в качестве семени в массиве байтов? – Jack

+0

yep, я добавил пример. –

0

Согласно документации, NoSuchAlgorithmException брошено

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

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

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

SecureRandom srA = new SecureRandom(); 

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

0

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

0

насчет:

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 
Смежные вопросы