概括为三种方式:
方式一:Integer.toHexString(int) 对应的是: Integer.parseInt(String, int)或者Integer.valueOf(String, int)
方式二:位运算(& 与 |)
方式三:算术运算
package com.example.md5utils;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.xml.sax.Parser;
public class MD5Utils {
private static final int RADIX_16 = 16;//16进制
public static String HASH_ALGORITHM = "MD5";
public static String generate(String str) {
byte[] md5 = getMD5(str.getBytes());
BigInteger abs = new BigInteger(md5).abs();
return abs.toString(Character.MAX_RADIX);
}
/**
* 方式一:<br>
* byte[] or byte转换16进制字符串<br>
* 使用Integer.toHexString(int)
* @param str
* @return
*/
public static String hexString(String str) {
StringBuilder sb = new StringBuilder();
byte[] md5 = getMD5(str.getBytes());
for (int i = 0; i < md5.length; i++) {
int temp = md5[i] & 0Xff;
String hexString = Integer.toHexString(temp);
if (hexString.length() < 2) {
sb.append("0").append(hexString);
} else {
sb.append(hexString);
}
}
return sb.toString();
}
/**
* 方式二:<br>
* byte[] or byte转换16进制字符串<br>
* 使用Integer.toHexString(int)
* @param str
* @return
*/
public static String hexString2(String str) {
// char[] chars = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder();
byte[] md5 = getMD5(str.getBytes());
for (int i = 0; i < md5.length; i++) {
int heigh = (md5[i] & 0xF0)>>4;//高位值
sb.append(chars[heigh]);//高位值对应的代表符号
int low = (md5[i] & 0x0F);//低位值
sb.append(chars[low]);//低位值对应的代表符号
}
return sb.toString();
}
/**
* 方式三:<br>
* byte[] or byte转换16进制字符串<br>
* 使用Integer.toHexString(int)
* @param str
* @return
*/
public static String hexString3(String str) {
char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder();
byte[] md5 = getMD5(str.getBytes());
for (int i = 0; i < md5.length; i++) {
int temp = md5[i];//byte 8位 int 4字节 32位 小—>大 可以直接复制
if (temp < 0) {//负数转换成int中正数
temp =temp + 256;//byte的字节,8位,范围[-127~128],跨度256
}
int heigh = temp / 16;//高位值
int low = temp % 16;//低位值
sb.append(chars[heigh]);//高位值对应的代表符号
sb.append(chars[low]);//低位值对应的代表符号
}
return sb.toString();
}
/**
* 16进制字符串转成byte[] or byte </br>
* 根据byte 8位 与16进制 4位关系,需要2个16进制字符组成一个byte
* @param hex
* @return
*/
public static byte[] byteFormHex(String hex) {
byte[] bytes = new byte[hex.length()/2];
for (int i = 0; i < bytes.length; i++) {
//16进制字符转换成int->位运算(取int(32位)低8位,即位与运算 &0xFF)->强转成byte
bytes[i] = (byte) (0xFF & Integer.parseInt(hex.substring(i*2, i*2+2), RADIX_16));
}
return bytes;
}
/**
* 16进制字符串转成byte[] or byte </br>
* 根据byte 8位 与16进制 4位关系,需要2个16进制字符组成一个byte
* @param hex
* @return
*/
public static byte[] byteFormHex2(String hex) {
int length = hex.length()/2;
char[] chars = hex.toCharArray();
byte[] bytes = new byte[length];
for (int i = 0; i < length; i++) {
int position = i*2;
//charToByte(chars[position])<<4 高位
//charToByte(chars[position+1]) 低位
//高位与低位进行或运算—>组成byte
bytes[i] = (byte) (charToByte(chars[position])<<4 | charToByte(chars[position+1]));
}
return bytes;
}
/**
* 16进制字符串转成byte[] or byte </br>
* 根据byte 8位 与16进制 4位关系,需要2个16进制字符组成一个byte
* @param hex
* @return
*/
public static byte[] byteFormHex3(String hex) {
int length = hex.length()/2;
char[] chars = hex.toCharArray();
byte[] bytes = new byte[length];
for (int i = 0; i < length; i++) {
int position = i*2;
//算术运算方式
int temp = charToByte(chars[position])*16;
temp = temp + charToByte(chars[position+1]);
bytes[i] = (byte) (0xFF & temp);//取低8位
}
return bytes;
}
/**
* 字符转成byte
* @param c
* @return
*/
private static byte charToByte(char c) {
String radix16Symbol = "0123456789ABCDEF";//16进制代表符号
//获取Char的索引值,即是该字符的值,直接转成byte,该值(int类型)此时不会超过byte类型范围
return (byte) radix16Symbol.indexOf(c);
}
private static byte[] getMD5(byte[] bytes) {
byte[] tmp = null;
try {
MessageDigest digest = MessageDigest.getInstance(HASH_ALGORITHM);
digest.update(bytes);
tmp = digest.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return tmp;
}
}
源码链接:http://download.youkuaiyun.com/detail/dennisruan/9491955