计算md5
public class MD5UtilsTest {
private static final char[] HEX_CHARS = {
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b',
'c', 'd', 'e', 'f'
};
@Test
public void testMd5() throws NoSuchAlgorithmException {
String input = "1";
MessageDigest instance = MessageDigest.getInstance("MD5");
String md5 = byteArrayToHex(instance.digest(input.getBytes(StandardCharsets.UTF_8)));
System.out.println(md5);
}
/**
* 将字节数组转换为16进制的字符串
*/
private static String byteArrayToHex(byte[] byteArray) {
char charArray[] = new char[byteArray.length << 1];//左移1位,相当于乘以2
if (charArray.length < byteArray.length) {
throw new RuntimeException("The length out of range!");
}
int index = 0;
for (byte b : byteArray) {
charArray[index++] = HEX_CHARS[(b >>> 0x4) & 0xf];//把字节高4位转为16进制字符
charArray[index++] = HEX_CHARS[b & 0xf];//把字节低4位转为16进制字符
}
return new String(charArray);
}
}
执行testMd5()结果:
c4ca4238a0b923820dcc509a6f75849b
异或交换两个变量
@Test
public void xor_swap() {
int a = 111;
int b = 666;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a = " + a + ", b=" + b);
}
执行结果
a = 666, b=111
java中int类型10进制转为16进制
public class BitOperationTest {
public String toHexString(int n, char[] digits) {
char[] buf = new char[8];//java中int类型是4个字节,转换为16进制最大长度不会超过8
int pos = buf.length;
do {
buf[--pos] = digits[n & 0xf];//从最低4位开始,每4位二进制转换为16进制字符
} while ((n >>>= 0x4) != 0 && pos > 0);//n >>>= 0x4 即 无符号右移4位
return new String(buf, pos, buf.length - pos);
}
@Test
public void testToHexString() {
char[] digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
String value = toHexString(31, digits);
System.out.println(value);
}
}
执行testToHexString()结果
1f