Шестнадцатеричный для целого в 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. Возможно, я делаю это неправильно, но может ли кто-нибудь дать мне совет, чтобы достичь этого правильно?
Спасибо за помощь!
Ответы
Ответ 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.