Java中的hex整数
我正在尝试将一个stringhex转换为一个整数。 stringhex是从散列函数(sha-1)计算出来的。 我得到这个错误:java.lang.NumberFormatException。 我想它不喜欢hex的string表示。 我怎样才能做到这一点。 这是我的代码:
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(); }
例如,当我传递这个string: _DTOWsHJbEeC6VuzWPawcLA ,他的哈希值为 : 0xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15
但是我得到:java.lang.NumberFormatException:对于inputstring:“ 0xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15 ”
我真的需要这样做。 我有一个由它们的UUID标识的元素的集合,它们是string。 我将不得不存储这些元素,但我的限制是使用一个整数作为他们的ID。 这就是为什么我计算给定的参数的散列,然后我转换为一个int。 也许我做错了,但有人可以给我一个build议,以实现这一点!
谢谢你的帮助 !!
为什么你不使用Java的function:
如果你的数字很小(小于你的),你可以使用: Integer.parseInt(hex, 16)
把hexstring转换成一个整数。
String hex = "ff" int value = Integer.parseInt(hex, 16);
对于像你这样的大数字,请使用public BigInteger(String val, int radix)
BigInteger value = new BigInteger(hex, 16);
@See JavaDoc:
- Integer.parseInt(string值,int基数)
- BigInteger(string值,int基数 )
你可以使用这个方法: https : //stackoverflow.com/a/31804061/3343174它完全转换任何hex数字(呈现为一个string)为十进制数
SHA-1产生一个160位的消息(20字节),太大而不能存储在一个int
或long
值中。 正如拉尔夫所说,你可以使用BigInteger。
为了得到(不太安全的)int散列,你可以返回返回的字节数组的散列码。
另外,如果你真的不需要SHA,你可以使用UUID的String哈希码。
我终于根据您的所有评论find了我的问题的答案。 谢谢,我试过这个:
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"); } //.... }
这个解决scheme不是最优的,但我可以继续我的项目。 再次感谢你的帮助
这是因为byte[] output
是正确的,而字节数组,你可能认为它是一个字节数组,表示每一个整数,但是当你将它们全部添加到一个string中时,你会得到一些不是整数的东西,这就是为什么。 您可以将其作为一个整数数组,也可以尝试创build一个BigInteger实例。