我知道这听起来像是一个广泛的问题,但我可以通过一个例子来缩小范围。我在Java方面非常新手。在我的“学习”项目中,我想创建一个内部MD5文件哈希器供我们使用。我开始非常简单,尝试对字符串进行哈希,然后再转到文件。我创建了一个名为MD5Hasher.java的文件,并编写了以下内容:
import java.security.*;
import java.io.*;
public class MD5Hasher{
public static void main(String[] args){
String myString = "Hello, World!";
byte[] myBA = myString.getBytes();
MessageDigest myMD;
try{
myMD = MessageDigest.getInstance("MD5");
myMD.update(myBA);
byte[] newBA = myMD.digest();
String output = newBA.toString();
System.out.println("The Answer Is: " + output);
} catch(NoSuchAlgorithmException nsae){
// print error here
}
}
}
我访问了java.sun.com,查看了java.security的javadoc,以了解如何使用MessageDigest类。阅读后,我知道我需要使用“getInstance”方法来获取可用的MessageDigest对象。Javadoc接着说:“使用update方法处理数据。”因此,我查看了update方法,并确定我需要使用其中一个,将我的字符串转换为字节数组并传递给它,因此我添加了这一部分。Javadoc继续说:“在更新所有要更新的数据之后,应调用digest方法之一来完成哈希计算。”我再次查看了方法,并发现digest返回一个字节数组,因此我添加了这一部分。然后,我对新的字节数组使用“toString”方法,以获得可以打印的字符串。但是,当我编译和运行代码时,打印出来的只有这个:
答案是:[B@4cb162d5
我在StackOverflow上找到了一些信息,发现了以下示例:(如何生成MD5哈希?)
String plaintext = 'your text here';
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 ){
hashtext = "0"+hashtext;
}
看起来我唯一会遗漏的部分可能是"BigInteger"部分,但我不确定。
因此,经过这一切,我想问的是,你怎么知道要使用“BigInteger”部分?我错误地认为我的newBA对象上的“toString”方法会将其转换为可读的输出,但显然我错了。一个人怎么才能知道在Java中该走哪条路?我有C语言背景,所以这个Java东西看起来很奇怪。有什么建议可以让我不必总是通过谷歌搜索如何做某些事情而变得更好吗?
感谢大家抽出时间阅读。 :-)