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字节),太大而不能存储在一个intlong值中。 正如拉尔夫所说,你可以使用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实例。