import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class JavaMD5 {
public static void main(String[] args) {
String passwordToHash = "MyPassword123";
String generatedPassword = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(passwordToHash.getBytes());
byte[] bytes = md.digest();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
generatedPassword = sb.toString();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(generatedPassword);
}
}
Run Code Online (Sandbox Code Playgroud)
这一行是问题所在:
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
Run Code Online (Sandbox Code Playgroud)
每个部分在这个结构中做了什么?
谢谢,我很抱歉要求Beacuse我是java的新手.
据推测,大部分代码都是清晰的,这里唯一的谜是这个表达式:
(bytes[i] & 0xff) + 0x100
Run Code Online (Sandbox Code Playgroud)
第一部分:
bytes[i] & 0xff
Run Code Online (Sandbox Code Playgroud)
加宽在位置字节i到int的比特位置8-31用零值.在Java中,byte数据类型是带符号的整数值,因此扩展符号扩展了该值.如果没有& 0xff,大于0x7f的值将最终为负值int.其余的是相当明显的:它增加了0x100,它只是打开索引8处的位(因为它保证为0 in (bytes[i] & 0xff).然后String通过调用将其转换为十六进制值Integer.toString(..., 16).
首先添加0x100然后剥离1(由substring(1)调用完成,从位置1开始到结束的子字符串)的原因是为了保证最终结果中有两个十六进制数字.否则,低于0x10的字节值在转换为十六进制时最终将成为一个字符的字符串.
所有这些都具有更好的性能(当然不是更清晰)是有争议的:
sb.append(String.format("%02x", bytes[i]));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4899 次 |
| 最近记录: |