我想计算一个字符串的散列值,但散列值应该是一个数字(长整数或整数)。整数散列到字符串值
换句话说,我想计算一个字符串的整数散列。不要担心合谋抵抗。
有没有办法将SHA-256的MessageDigest转换为数字。
我正在使用Java来完成此操作。
我想计算一个字符串的散列值,但散列值应该是一个数字(长整数或整数)。整数散列到字符串值
换句话说,我想计算一个字符串的整数散列。不要担心合谋抵抗。
有没有办法将SHA-256的MessageDigest转换为数字。
我正在使用Java来完成此操作。
一个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());
}
尝试调用hashCode()方法。它已经实施并且完全按照你的要求。
类String
与其他任何Java类一样,它有一个hashcode
方法,它将字符串转换为数字。请参阅此方法的documentation以了解其使用的确切算法。
最明显的是有关于String
至于转换的消息摘要为数字的hashCode()
方法,你可以再次使用hashCode
或采取从摘要的byte
阵列和紧凑下来到任何你想要的大小,整数,长或任何与(说)异或。
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;
}
java中的每个对象都有hashCode()
方法。您可以覆盖它并指定您自己的逻辑。看看examples。
请在这里找到它:http://pastebin.com/j6Cffkcp;
我但它只返回字符串。
使用JCE类(MessageDigest)创建的加密哈希本质上是一个字节序列(SHA-256为256位)。如果您希望存储和管理这些数字,则需要将它们转换为BigInteger或BigDecimal对象(根据摘要的长度)。
并不总是会计算出String对象的加密哈希值,而且通常是为了对秘密进行单向加密而完成的。如果您将哈希用于其他用途,尤其是为了确保字符串之间的某种唯一性(将这些对象存储在哈希映射中时这很重要),最好使用由String.hashCode method计算的哈希值。
你能发表一些代码来帮助描述你在找什么吗? – Knubo 2010-11-25 11:28:20