美文网首页
Java MessageDigest.getInstance返回

Java MessageDigest.getInstance返回

作者: pxchen | 来源:发表于2018-10-31 20:54 被阅读0次

问题

在当前的性能管理系统中,系统会通过Java自带的MD5 Digest为性能指标生成一个固定的列名。
但是在测试的过程中,总是会发现有些指标生成列名失败,或者列名相同。

定位及原因

生成列名代码大概如下

    private static volatile MessageDigest md5MessageDigest = null;
    
    public static String getField(String value) throws NoSuchAlgorithmException {
        if (md5MessageDigest == null) {
            md5MessageDigest = MessageDigest.getInstance("MD5");
        }
        
        byte[] digestBytes = md5MessageDigest.digest(value.getBytes(StandardCharsets.UTF_8));
        
        return toField(digestBytes);
    }
    
    public static String toField(byte[] digestBytes) {
        // 实际生成比下面的复杂,仅为了演示。
        return "ind_" + String(digestBytes, StandardCharsets.UTF_8);
    }

MessageDigest对应的MD5 Digest实例包含了个多个非静态变量,不加锁时使用同个MD5 Digest会出现多线程问题。
系统的性能指标一般是通过Excel一次性导入,导入是并发的,所以会引发上面的问题。

解决方法

每次使用MessageDigest.getInstance获取唯一的MD5 Digest。

    public static String getField(String value) throws NoSuchAlgorithmException {
        MessageDigest md5MessageDigest = MessageDigest.getInstance("MD5");

        byte[] digestBytes = md5MessageDigest.digest(value.getBytes(StandardCharsets.UTF_8));

        return toField(digestBytes);
    }

    public static String toField(byte[] digestBytes) {
        // 实际生成比下面的复杂,仅为了演示。
        return "ind_" + String(digestBytes, StandardCharsets.UTF_8);
    }

相关文章

  • Java MessageDigest.getInstance返回

    问题 在当前的性能管理系统中,系统会通过Java自带的MD5 Digest为性能指标生成一个固定的列名。但是在测试...

  • java 获取URL 上面所有参数,直接分割,返回参数 map

    java 获取URL 上面所有参数,直接分割,返回参数 map java 获取URL 上面所有参数,直接分割,返回...

  • JVM监控

    1、jps jps命令:返回当前系统中的Java的进程号 -l:返回Java进程全路径 -q:...

  • java返回结果集封装

    java返回结果集封装

  • Java方法签名与方法块

    Java方法签名 Java的方法签名不包括返回值。 Java的方法签名包括:方法名和参数。不包括方法返回值。所以由...

  • Java基础整理(二)

    Java方法的几种类型 无参无返回值的方法 无参有返回值的方法 有参无返回值的方法 有参有返回值的方法 Java ...

  • 11.条件控制语句if

    kotlin的if有返回值的,java的if没有返回值,kotlin的if是表达式语法,java的if属于声明式语...

  • 12月30日学习内容

    Java方法 Java方法他们可有返回值也可以没有返回值,可以有参数,也可以没有参数。 创建方法 public c...

  • kotlin基础语法

    函数定义 有返回值的函数 无返回值的函数(类似Java中的void): 可变长参数函数 静态方法 Java代码: ...

  • 待记录的一些笔记

    java mybatis 的自动生成 分页 联合查询 返回主键等一些小坑java lamba 的使用整理java ...

网友评论

      本文标题:Java MessageDigest.getInstance返回

      本文链接:https://www.haomeiwen.com/subject/xyxotqtx.html