代码之家  ›  专栏  ›  技术社区  ›  Shani

整数哈希到字符串值

  •  0
  • Shani  · 技术社区  · 14 年前

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

    换句话说,我想计算字符串的整数散列。 共谋阻力不在关注之列。

    是否有方法将SHA-256的消息摘要转换为数字。

    我正在使用Java来实现这一点。

    7 回复  |  直到 14 年前
        1
  •  0
  •   stacker    14 年前

    Sha散列有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() );
        }
    
        2
  •  1
  •   AlexR    14 年前

    尝试调用hashCode()方法。它已经被实现了,并且做了你想要的事情。

        3
  •  1
  •   daveb    14 年前

    最明显的是 hashCode() 方法打开 String

    至于将消息摘要转换为数字,您可以使用 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;
    }
    
        4
  •  0
  •   Yuval    14 年前

    String 有一个 hashcode 方法,与任何其他Java类一样,它将字符串转换为数字。见 documentation 为了得到它所使用的精确算法。

        5
  •  0
  •   Vladimir Ivanov    14 年前

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

        6
  •  0
  •   Mohamed Saligh    14 年前

    请在这里找到: http://pastebin.com/j6Cffkcp ;

    但它只返回字符串。

        7
  •  0
  •   Vineet Reynolds    14 年前

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

    并不总是计算字符串对象的加密散列,而且通常是为了单向加密机密而进行的。如果您将哈希用于其他目的,特别是为了确保字符串之间的某种唯一性(这在将这些对象存储在哈希映射中时很重要),那么最好使用 String.hashCode method .