各类Hash算法-Java版

以下Hash算法经常被用在数据的签名中,这里整理了一下Java版sha-x和md5算法

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.MessageDigest;


public class SHA_1 {

	public static void main(String[] args) {

		String v0_1,v0_2,v0_3;
		v0_1 = SHA1("手机号码13665422381");
		System.out.println("SHA1加密完成:"+v0_1);  //sha1加密完成
		System.out.println("SHA1加密完成(大写):"+v0_1.toUpperCase());  //sha1加密完成
		v0_2 =MD5("手机号码13665422381");
		System.out.println("MD5加密完成:"+v0_2);  //sha1加密完成
		System.out.println("MD5加密完成(大写):"+v0_2.toUpperCase());  //sha1加密完成
		v0_3 = SHA256("手机号码13665422381");
		System.out.println("SHA256加密完成:"+v0_3);  //sha1加密完成
		System.out.println("SHA256加密完成(大写):"+v0_3.toUpperCase());  //sha1加密完成
		
	}

	

	public final static String SHA1(String string) {
	    try {
	        MessageDigest digest = MessageDigest.getInstance("SHA-1");
	        digest.update(string.getBytes("UTF-8"));  //不设置编码的话中文加密会错误
	        byte messageDigest[] = digest.digest();
	        // Create Hex String
	        StringBuffer hexString = new StringBuffer();
	        // 字节数组转换为十六进制 数
	        for (int i = 0; i < messageDigest.length; i++) {
	            String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
	            if (shaHex.length() < 2) {
	                hexString.append(0);
	            }
	            hexString.append(shaHex);
	        }
	        return hexString.toString();

	       } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
	         e.printStackTrace();}
	    return "";
	}
	
	public final static String SHA256(String string) {
	    try {
	        MessageDigest digest = MessageDigest.getInstance("SHA-256");
	        digest.update(string.getBytes("UTF-8"));  //不设置编码的话中文加密会错误
	        byte messageDigest[] = digest.digest();
	        // Create Hex String
	        StringBuffer hexString = new StringBuffer();
	        // 字节数组转换为十六进制 数
	        for (int i = 0; i < messageDigest.length; i++) {
	            String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
	            if (shaHex.length() < 2) {
	                hexString.append(0);
	            }
	            hexString.append(shaHex);
	        }
	        return hexString.toString();

	       } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
	         e.printStackTrace();}
	    return "";
	}



public final static String MD5(String string) {
    char hexDigits[] = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};// 用来将字节转换成 16 进制表示的字符
    try {
       
        MessageDigest mdTemp = MessageDigest.getInstance("MD5");
        mdTemp.update(string.getBytes("UTF-8"));  //不设置编码的话中文加密会错误
        byte tmp[] = mdTemp.digest(); // MD5 的计算结果是一个 128 位的长整数,
        // 用字节表示就是 16 个字节
        char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
        // 所以表示成 16 进制需要 32 个字符
        int k = 0; // 表示转换结果中对应的字符位置
        for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
            // 转换成 16 进制字符的转换
            byte byte0 = tmp[i]; // 取第 i 个字节
            str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
            // >>> 为逻辑右移,将符号位一起右移
            str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
        }
        return new String(str); // 换后的结果转换为字符串
    } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
        return null;
    }
}

}

输出

SHA1加密完成:a2abdd6eab9630eac5c4753dfc9e7e4615ef9581
SHA1加密完成(大写):A2ABDD6EAB9630EAC5C4753DFC9E7E4615EF9581
MD5加密完成:e947becc135d128f45e16377741d85be
MD5加密完成(大写):E947BECC135D128F45E16377741D85BE
SHA256加密完成:725940c09f8ca18b008d096654b1e96dff1154ab991874ee857592065ae6db6a
SHA256加密完成(大写):725940C09F8CA18B008D096654B1E96DFF1154AB991874EE857592065AE6DB6A