2010-11-25 71 views
0

我想计算一个字符串的散列值,但散列值应该是一个数字(长整数或整数)。整数散列到字符串值

换句话说,我想计算一个字符串的整数散列。不要担心合谋抵抗。

有没有办法将SHA-256的MessageDigest转换为数字。

我正在使用Java来完成此操作。

+1

你能发表一些代码来帮助描述你在找什么吗? – Knubo 2010-11-25 11:28:20

回答

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()); 
    } 
1

尝试调用hashCode()方法。它已经实施并且完全按照你的要求。

0

String与其他任何Java类一样,它有一个hashcode方法,它将字符串转换为数字。请参阅此方法的documentation以了解其使用的确切算法。

1

最明显的是有关于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; 
} 
0

java中的每个对象都有hashCode()方法。您可以覆盖它并指定您自己的逻辑。看看examples

0

使用JCE类(MessageDigest)创建的加密哈希本质上是一个字节序列(SHA-256为256位)。如果您希望存储和管理这些数字,则需要将它们转换为BigInteger或BigDecimal对象(根据摘要的长度)。

并不总是会计算出String对象的加密哈希值,而且通常是为了对秘密进行单向加密而完成的。如果您将哈希用于其他用途,尤其是为了确保字符串之间的某种唯一性(将这些对象存储在哈希映射中时这很重要),最好使用由String.hashCode method计算的哈希值。