本帖最后由 苏紫方璇 于 2018-5-20 09:12 编辑
[Java] 纯文本查看 复制代码 public class MD5Utils {
public static String md5(String str) {
try {
MessageDigest md =MessageDigest.getInstance("MD5");//返回实现制定摘要算法的MessageDigest,有异常需要捕获下异常
byte[] bytes = md.digest(str.getBytes());//定义一个变量,把str转换成byte类型,在调用Java提供的方法进行加密,并赋值给bytes
String s = "" ; //定义一个空字符串接收加密后的字符串
for(byte b:bytes) { //遍历数组
s += Integer.toHexString(b >>> 4 & 0xF);//这里右移的原因是byte有效位8位所以要将16进制拆分成2个值;
//把数组里的每个值都无符号右移4,然后& 0xF(这是16进制),最后把结果装换成16进制并赋值给s
s += Integer.toHexString(b & 0xF);//byte有效位8位所以要将16进制拆分成2个值;
}
return s;//把加密的字符串返回
} catch (NoSuchAlgorithmException e) {
}
return null;
}s += Integer.toHexString(b >>> 4 & 0xF); 补充下这2个怎么运算的,举个例子,1111 1111 1111 1111 1111 1111 1101 0111 无符号右移4位,把最右边的4位去掉
0000 1111 1111 1111 1111 1111 1111 1101 这是右移之后的结果,然后在将他进行&运算0XF(与运算是要用二进制进行的所以要把0XF转换成2进制也就是1111)0000 0000 0000 0000 0000 0000 0000 1111 这是2进制的F0000 0000 0000 0000 0000 0000 0000 1101 这是&运算后的结果,应为跟&运算都为1才是1,所以这就拿到了第一个值接下来拿第二个值s += Integer.toHexString(b& 0xF);
1111 1111 1111 1111 1111 1111 1101 0111 直接与11110000 0000 0000 0000 0000 0000 0000 11110000 0000 0000 0000 0000 0000 0000 0111 这就拿到第二个值了 有什么错误请指出,我也是新手,也不是很懂,有什么遗漏也请在下方留言告诉我。转载请注明作者。 |