java 在Jenkins上运行Maven JUnit测试时,散列函数给出不同的输出

5lhxktic  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(130)

如标题所示,有这样一个函数,该函数将ByteArrayResource和表示要使用的算法名称的String作为参数。
我正在使用java.security.MessageDigest以及GnuCryptoBouncyCastleProvider提供程序。
我有一些问题,确定问题可能是什么,我的机器和Jenkins之一都运行java 11,这里的代码:
试验:

void hashOk{
    byte[] bytes = Files.readAllBytes(Path.of("path/to/file.xml"));

    String hash1 = "5EDF3285285FDABCFFB7019E2442B31F";
    String hash2 = hashService.hash(new ByteArrayResource(bytes), "MD5");

    Assertions.assertEquals(hash1, hash2);
}

服务:

public String hash(ByteArrayResource obj, String algorithm) throws NoSuchAlgorithmException {
    Security.addProvider(new BouncyCastleProvider());
    Security.addProvider(new GnuCrypto());

    var md = MessageDigest.getInstance(algorithm);

    try (DigestInputStream dis = new DigestInputStream(new BufferedInputStream(obj.getInputStream()), md)) {
        byte[] buffer = new byte[1024];
        while (dis.read(buffer) != -1) ;

        byte[] hash = md.digest();

        return DatatypeConverter.printHexBinary(hash).toUpperCase();

    } catch (IOException e) {...} }

我错过什么了吗?
以下是测试的结果,其中“hash1”是控制字符串,“hash2”是生成的字符串:
本地MD5

hash1: 5EDF3285285FDABCFFB7019E2442B31F
hash2: 5EDF3285285FDABCFFB7019E2442B31F

JenkinsMD5

hash1: 5EDF3285285FDABCFFB7019E2442B31F 
hash2: 7A7E0BBA2452963746BA4D71EB8CCFA3

我也尝试了不同的机器与Jenkins和它给出了相同的结果。
我找到的一些解决方案只是相同代码的不同排列(我也尝试过)。
有一个命令告诉我更改pom.xml,并将maven-surefire-plugin上的forkCount属性设置为0,但这给了我一个异常,因为它找不到散列测试(?)的文件。

vwoqyblh

vwoqyblh1#

我解决了这个问题,这真的是一个问题与文件的阅读。
在我将文件内容放在一行中并更改代码以只读取该文件一次(而不是每次测试读取一次)之后,一切都正常了。
谢谢你的帮助!

相关问题