gpt4 book ai didi

java - 如何将 int 转换为字节数组(这是一个局部变量),无论底层硬件的字节顺序如何都保证相同的结果

转载 作者:太空宇宙 更新时间:2023-11-04 06:57:30 25 4
gpt4 key购买 nike

我正在编写一个从对象集合生成哈希的方法。我需要确保,给定一组特定的输入,生成的哈希值在所有机器上都相同,因为该哈希值用于分布式系统中的验证过程。

此验证过程涉及用户在其计算机上生成哈希值,将该哈希值发送给中央机构,然后该中央机构重新生成哈希值(使用与用户使用的输入相同的输入)并验证哈希值是否匹配。

该方法使用 MessageDigest 生成哈希值。在此方法中,我们循环访问每个接收到的对象,并使用每个对象的哈希码更新 MessageDigest。最后,处理完所有对象后,我们从 MessageDigest 返回一个哈希值。

我关心的是 int 到字节数组的转换。目前我们正在使用 ByteBuffer 类来执行此转换。问题是:所有 JVM,无论它们运行在小端还是大端硬件上,都会生成相同的字节数组吗?或者硬件的“字节顺序”会影响字节数组吗?

我浏览了 JVM 规范,它提到了与类数据存储方式相关的大端字节序。但它没有具体提到局部变量。所以我不确定局部变量的字节顺序是否会影响生成哈希的方法的输出。

我正在编写的类(class)如下所示:

...
private final MessageDigest md;
...

public byte[] buildHashFromHashcodes(final Object... listOfObjects)
throws UnsupportedEncodingException {

byte[] bytes;

for (Object obj : listOfObjects) {

bytes = ByteBuffer.allocate(4).putInt(obj.hashCode()).array();
md.update(bytes);
}

return md.digest();
}

非常感谢!

最佳答案

ByteBuffer.order() 方法允许您获取和设置用于将多字节值(例如 intlong)存储到缓冲区中的字节顺序。

新创建的ByteBuffer的初始字节顺序 is always big-endian无论 JVM、操作系统还是硬件。

关于java - 如何将 int 转换为字节数组(这是一个局部变量),无论底层硬件的字节顺序如何都保证相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22531064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com