[Java的写法]之MD5对字符串签名操作

卜哥歌
• 阅读 576

对字符串签名后,1:长字符串变为32位字符:aacfbe08d042fddd8ee778b148efc923 2 : 只要长字符串内容不变,签名后得到的32位字符不变。适合用来做ID等。 private String genKeyId(String keyStr) { return Md5Utils.getStringMD5(keyStr); }

Md5Utils 类如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.lang3.StringUtils;

public class Md5Utils {
    protected static char[] hexDigits = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    protected static MessageDigest messagedigest = null;

    public Md5Utils() {      }
    static {
        try {
            messagedigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException var1) {
            var1.printStackTrace();
        }

    }

    public static String getFileMD5String(File file) throws IOException {
        InputStream fis = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        boolean var3 = false;

        int numRead;
        while((numRead = fis.read(buffer)) > 0) {
            messagedigest.update(buffer, 0, numRead);
        }

        fis.close();
        return bufferToHex(messagedigest.digest());
    }

    public static String getStringMD5(String str) {
        if (StringUtils.isEmpty(str)) {
            return "";
        } else {
            byte[] buffer = str.getBytes();
            messagedigest.update(buffer);
            return bufferToHex(messagedigest.digest());
        }
    }

    public static String bufferToHex(byte[] bytes) {
        return bufferToHex(bytes, 0, bytes.length);
    }

    private static String bufferToHex(byte[] bytes, int m, int n) {
        StringBuffer stringbuffer = new StringBuffer(2 * n);
        int k = m + n;

        for(int l = m; l < k; ++l) {
            appendHexPair(bytes[l], stringbuffer);
        }

        return stringbuffer.toString();
    }

    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
        char c0 = hexDigits[(bt & 240) >> 4];
        char c1 = hexDigits[bt & 15];
        stringbuffer.append(c0);
        stringbuffer.append(c1);
    }

    private static final String toHex(byte[] hash) {
        if (hash == null) {
            return null;
        } else {
            StringBuffer buf = new StringBuffer(hash.length * 2);

            for(int i = 0; i < hash.length; ++i) {
                if ((hash[i] & 255) < 16) {
                    buf.append("0");
                }

                buf.append(Long.toString((long)(hash[i] & 255), 16));
            }

            return buf.toString();
        }
    }

    public static String hash(String s) {
        try {
            return new String(toHex(getStringMD5(s).getBytes("UTF-8")).getBytes("UTF-8"), "UTF-8");
        } catch (Exception var2) {
            return s;
        }
    }

    public static void main(String[] args) {
        System.out.println(getStringMD5("admin123"));
        System.out.println(hash("123456"));
    }


}
点赞
收藏
评论区
推荐文章
秋刀鱼 秋刀鱼
2年前
Java字符串:内存分析/方法梳理
近期在学习Java字符串,梳理总结一下,更多是关于内存角度去分析,希望对你有帮助。一、Java字符串的特性1.java.lang.String使用的final修饰,不能被修饰2.字符串底层封装了字符数组以及针对字符串数组的操作算法3.Java使用的是Unicode编码方式,任何一个字符对应两个字节的编码4.字符串一旦创建,对象内容不能改变,
Bill78 Bill78
3年前
Python 字符串常用方法总结
明确:对字符串的操作方法都不会改变原来字符串的值1,去掉空格和特殊符号name.strip()去掉空格和换行符name.strip('xx')去掉某个字符串name.lstrip()去掉左边的空格和换行符name.rstrip()去掉右边的空格和换行符2,字符串的搜索和替换name.count('x')查找某个
Wesley13 Wesley13
3年前
MD5签名问题
签名传入的参数中包含数组类型的参数,String\\xynewString\\{”116.288418”,“39.832535”};加密过程中需要转换为字符串Arrays.toString(xy)publicstaticMap<String,ObjectaddCommonParams(Map<String,Obj
Wesley13 Wesley13
3年前
Java的字符串连接符(+)
在Java中字符串是一个常用的东西,而其一个常用的操作是字符串的拼接,Java对此提供了一种非常直观的操作方式——即操作符。Stringstr0"a";Stringstr1str0"b";如上的程序片段就实现了一个字符串的拼接,可以看到整个描述非常简洁,一目了然。学习Java的时候,这是
Wesley13 Wesley13
3年前
MySQL常用函数
字符串函数concat(a,b,c,...)连接为一个字符串insert(str,x,y,instr)将字符串str从第x位置开始,y个字符长的子串替换为字符串instrLower(str)所有字符变为小写upper(str)所有字符变为大写
Wesley13 Wesley13
3年前
JS一个算法题
题目:实现超出整数存储范围的两个大整数想加function(a,b)。注意:参数a和b以及函数返回值都是字符串。目的:考算法,基本逻辑。我实现的基本思路是:①两个数字字符串长度补成一样,用字符串'0’补位,比如a'1111',b'22',b用'0'补位成'0022'.②分3中情况处理,初始值的长度比较,,a的长度大于b的长度,b的长
Wesley13 Wesley13
3年前
Java学习:字符串概述与特点
字符串概述与特点java.lang.String类代表字符串API当中说:Java程序中的所有字符串字面值(如“abc“)都作为此类的实例实现。其实就是说:程序当中所用的双引号字符串,都是String类的对象。(就算没有new,也照样是。)字符串的特点1.字符串的内容永远不可改变。【重点】
Stella981 Stella981
3年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
Stella981 Stella981
3年前
RedisTemplate操作命令
字符串操作redis储存的字符串都是以二进制的形式存在!字符串类型的内部编码有3种:int:8个字节的长整型。embstr:小于等于39个字节的字符串。raw:大于39个字节的字符串。Redis会根据当前值的类型和长度决定使用哪种内部编码实现。命令操作返回值set(K
Wesley13 Wesley13
3年前
Java 基础语法
常量:在程序运行期间,固定不变的量常量的分类:1.字符串常量:凡是用双引号引起来的部分,叫做字符串常量,例如:"abc","hello","123"2.整数常量:直接写上的数字,没有小数点,例如:100,200,0,2503.浮点数常量:直接写上的数字,有小数点,
卜哥歌
卜哥歌
Lv1
沿着星河轨迹踏遍人间春秋。
文章
4
粉丝
0
获赞
0