我想计算字符串的哈希值,但哈希值应该是一个数字(长整数)。
换句话说,我想计算字符串的整数哈希值。 共谋阻力不在乎。
有没有办法将SHA-256的MessageDigest转换为数字。
我正在使用Java来实现这一目标。
答案 0 :(得分:1)
尝试调用hashCode()方法。它已经实现并完全符合您的要求。
答案 1 :(得分:1)
最明显的是hashCode()
String
方法
至于将MessageDigest转换为数字,您可以再次使用hashCode
或从摘要中取出byte
数组并将其压缩到您想要的任何大小,整数,长整数或其他任何大小(比如)xor。
public int compactDigest(MessageDigest digest) {
byte [] byteArr = digest.digest();
// +3 since conversion to int array with divide length by four.
// and we don't want to lose any bytes.
ByteBuffer bytes = ByteBuffer.allocate(byteArr.length + 3);
bytes.put(byteArr);
bytes.rewind();
IntBuffer ints = bytes.asIntBuffer();
int compactDigest = 0;
for (int i = 0; i < ints.limit(); ++i) {
compactDigest ^= ints.get(i);
}
return compactDigest;
}
答案 2 :(得分:0)
类String
有一个hashcode
方法,就像任何其他Java类一样,它将字符串转换为数字。有关其使用的确切算法,请参阅此方法的documentation。
答案 3 :(得分:0)
java中的每个对象都有hashCode()
方法。您可以覆盖它并指定自己的逻辑。查看examples。
答案 4 :(得分:0)
Sha Hash有256位,例如
"364b7e70a9966ef7686ab814958cd0017b7f19147a257d40603d4a1307662b42"
这将超出long和integer的范围。
您可以使用new BigInteger( hash, 16 );
进行十进制表示。
public static void main(String[] args) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update("string".getBytes() );
byte[] hash = digest.digest();
BigInteger bi = new BigInteger( hash );
System.out.println( "hex:" + bi.toString(16) + "\r\ndec:" + bi.toString() );
}
答案 5 :(得分:0)
请在此处找到:http://pastebin.com/j6Cffkcp;
我但它只返回字符串。
答案 6 :(得分:0)
使用JCE类创建的加密哈希(在您的情况下为MessageDigest)本质上是一个字节序列(SHA-256为256位)。如果您希望存储和管理这些数字,您需要将它们转换为BigInteger或BigDecimal对象(给定摘要的长度)。
并不总是计算String对象的加密哈希值,并且通常是为了对秘密进行单向加密。如果您将哈希用于其他目的,尤其是为了确保字符串之间存在某种独特性(这在将这些对象存储在哈希映射中时很重要),最好使用由{{3计算的哈希值}}