【问题标题】:why is a minus sign prepended to my biginteger?为什么我的 biginteger 前面有一个减号?
【发布时间】:2011-01-08 08:34:26
【问题描述】:
package ewa;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.math.BigInteger;
/**
 *
 * @author Lotus
 */
public class md5Hash {

    public static void main(String[] args) throws NoSuchAlgorithmException {
        String test = "abc";

        MessageDigest md = MessageDigest.getInstance("MD5");
        try {
            md.update(test.getBytes("UTF-8"));
            byte[] result = md.digest();
            BigInteger bi = new BigInteger(result);
            String hex = bi.toString(16);
            System.out.println("Pringting result");
            System.out.println(hex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(md5Hash.class.getName()).log(Level.SEVERE, null, ex);
        }


    }
}

我正在测试字节到十六进制的转换,完成后,最终结果在字符串的开头有一个减号,为什么会发生这种情况?我已经阅读了文档,它说它会添加一个减号,但是我不明白。减号会影响哈希结果吗?因为我要实现它来散列存储在我的数据库中的密码

【问题讨论】:

    标签: java


    【解决方案1】:

    因为BigInteger 恰好是负数,意味着最高有效位是 1。如果您想要一个正数,请使用 sign-magnitude constructor

    new BigInteger(1, result)
    

    我不清楚您为什么要实现自己的 MD5 哈希包装器。为什么不能将哈希存储为 BINARY 或 BLOB?

    【讨论】:

    • 谢谢,解决了这个问题。我只是为我的网站实现一个非常简单的哈希,不知道你将哈希存储为二进制或 blob 是什么意思
    • @kyrogue,例如MySQL,请参阅this documentation。其他数据库应该类似。使用二进制类型避免了将散列转换为字符串的步骤。您还应该考虑使用其他哈希,例如 SHA-256,因为 MD5 现在被认为是弱的。
    • 我打算用microsoft access来做数据库,这是一个非常简单的学校项目,通过在数据库中的密码上显示一个md5hash,它可以让我得到一些额外的分数
    • @kyrogue,MS Access also has BINARY 类型。
    • 嘿,谢谢,但如果我没记错的话,我的学校使用 MS access 2002,所以它没有二进制数据类型,除非我能以某种方式设置它
    【解决方案2】:

    BigInteger 已签名。在字节表示中,如果设置了最高位,则显示为负数。解决此问题的一种方法可能是将 0 附加到数组的开头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2021-04-02
      • 2013-04-14
      • 1970-01-01
      相关资源
      最近更新 更多