我知道这听起来是个宽泛的问题,但我可以用一个例子缩小范围。我在Java是个新手。对于我的一个“学习”项目,我想创建一个内部的MD5文件- hasher供我们使用。我一开始非常简单,尝试散列一个字符串,然后再转到一个文件。我创建了一个名为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的javadocs,以了解如何使用MessageDigest类。在阅读完之后,我知道我必须使用"getInstance“方法来获得一个可用的MessageDigest对象。Javadoc接着说:“数据是通过它使用更新方法处理的。”因此,我查看了update方法,确定我需要使用给它一个字符串字节数组的方法,所以我添加了这个部分。Javadoc接着说:“一旦所有要更新的数据都被更新了,就应该调用其中一个摘要方法来完成哈希计算。”我再次查看了这些方法,并看到该摘要返回了一个字节数组,因此我添加了这个部分。然后,我在新字节数组上使用了"toString“方法来获取可以打印的字符串。但是,当我编译和运行代码时,输出的所有内容如下:
答案是:[B@4cb162d5
我在StackOverflow上做了一些调查,并在这里发现了一些信息:
这给出了以下例子:
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对象上的“newBA”方法会将其转换为可读的输出,但我显然错了。一个人怎么知道用Java走哪条路呢?我有C的背景,所以这个看起来很奇怪。对于如何在谷歌上搜索如何一直做一些事情,我如何才能变得更好而不必“欺骗”,有什么建议吗?
谢谢大家抽出时间阅读。:-)
发布于 2010-07-13 15:18:43
MessageDigests计算某物的字节数组,通常看到的字符串(如1f3870be274f6c49b3e31a0c6728957f)实际上只是将字节数组转换为十六进制字符串。
当您调用MessageDigest.toString()时,它调用MessageDigest.digest().toString(),在Java中,byte[]的toString方法(由MessageDigest.digest()返回)返回对字节的某种引用,而不是实际的字节。
在您发布的代码中,字节数组被更改为整数(在本例中是BigInteger,因为它非常大),然后转换为十六进制以打印为字符串。
由摘要计算的字节数组表示一个数字(根据http://en.wikipedia.org/wiki/MD5计算的128位数字),该数字可以转换为任何其他基,因此MD5的结果可以表示为基-10数字、基-2数字(如字节数组中的数字),或者最常见的是基-16数字。
https://stackoverflow.com/questions/3238548
复制相似问题