Подтвердить что ты не робот

Шестнадцатеричный для целого в Java

Я пытаюсь преобразовать шестнадцатеричный String в целое число. Шестнадцатеричная шестнадцатеричная строка была рассчитана из хэш-функции (sha-1). Я получаю эту ошибку: java.lang.NumberFormatException. Я думаю, это не похоже на строковое представление шестнадцатеричного. Как я могу это достичь. Вот мой код:

public Integer calculateHash(String uuid) {

    try {
        MessageDigest digest = MessageDigest.getInstance("SHA1");
        digest.update(uuid.getBytes());
        byte[] output = digest.digest();

        String hex = hexToString(output);
        Integer i = Integer.parseInt(hex,16);
        return i;           

    } catch (NoSuchAlgorithmException e) {
        System.out.println("SHA1 not implemented in this system");
    }

    return null;
}   

private String hexToString(byte[] output) {
    char hexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'A', 'B', 'C', 'D', 'E', 'F' };
    StringBuffer buf = new StringBuffer();
    for (int j = 0; j < output.length; j++) {
        buf.append(hexDigit[(output[j] >> 4) & 0x0f]);
        buf.append(hexDigit[output[j] & 0x0f]);
    }
    return buf.toString();

}

Например, когда я передаю эту строку: _DTOWsHJbEeC6VuzWPawcLA, его хэш: 0xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15

Но я получаю: java.lang.NumberFormatException: для строки ввода: " 0xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15"

Мне действительно нужно это сделать. У меня есть набор элементов, идентифицированных их UUID, которые являются строками. Мне нужно будет сохранить эти элементы, но мои ограничения состоят в том, чтобы использовать целое число в качестве своего идентификатора. Именно поэтому я вычисляю хэш заданного параметра, а затем конвертирую в int. Возможно, я делаю это неправильно, но может ли кто-нибудь дать мне совет, чтобы достичь этого правильно?

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

4b9b3361

Ответ 1

Почему вы не используете для этого функцию java:

Если ваши номера малы (меньше ваших), вы можете использовать: Integer.parseInt(hex, 16) для преобразования Hex-String в целое число.

  String hex = "ff"
  int value = Integer.parseInt(hex, 16);  

Для больших чисел, подобных вашим, используйте public BigInteger(String val, int radix)

  BigInteger value = new BigInteger(hex, 16);

@See JavaDoc:

Ответ 2

вы можете использовать этот метод: fooobar.com/questions/244874/... он идеально преобразует любое шестнадцатеричное число (представленное как строка) в десятичное число

Ответ 3

SHA-1 создает 160-битное сообщение (20 байтов), которое слишком велико для сохранения в значении int или long. Как предлагает Ральф, вы можете использовать BigInteger.

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

Кроме того, если вам вообще не нужна SHA, вы можете просто использовать хэш-код UUID String.

Ответ 4

Наконец, я нахожу ответы на свой вопрос, основываясь на всех ваших комментариях. Спасибо, я пробовал это:

public Integer calculateHash(String uuid) {

    try {
        //....
        String hex = hexToString(output);
        //Integer i = Integer.valueOf(hex, 16).intValue();
        //Instead of using Integer, I used BigInteger and I returned the int value.
        BigInteger bi = new BigInteger(hex, 16);
        return bi.intValue();`
    } catch (NoSuchAlgorithmException e) {
        System.out.println("SHA1 not implemented in this system");
    }
    //....
}

Это решение не оптимально, но я могу продолжить свой проект. Еще раз спасибо за вашу помощь

Ответ 5

Что, поскольку byte[] output - это хорошо, и массив байтов, вы можете думать о нем как о массиве байтов, представляющих каждое целое число, но когда вы добавляете их все в одну строку, вы получаете то, что НЕ является целое число, вот почему. Вы можете либо иметь его как массив целых чисел, либо попытаться создать экземпляр BigInteger.