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

标签 java hash endianness

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

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

该方法使用 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/

相关文章:

javascript - window.location.hash 不创建浏览器历史条目

c++ - 在转换 IP 时修复 inet_ntoa 中的 Endianess 错误显示反向值

java - 在 Java Swing 中取消选择单选按钮

java - Autowiring 依赖项为空

java - 阻止要扩展的接口(interface)

java - 类所在的目录与包指定的目录不同——怎么会这样?

Java打印对象、封装

javascript - 那里有什么好的 JavaScript 散列(代码/表)实现吗?

c - 这段代码是否真的可以知道系统是小端还是大端?

static-analysis - 任何有助于检测 CPU 端序问题的静态分析工具?