rust - Rust结构/枚举的可复制加密哈希

标签 rust endianness sha256

目前,我正在使用以下代码来获取Rust结构和枚举的sha256哈希值。

pub fn sha256<T: Sized + Serialize>(ser: T) -> [u8; 32] {
    let str = ron::ser::to_string(&ser).expect("serialization has failed");

    let mut hasher = Sha256::new();
    hasher.update(str);
    let hash = hasher.finalize();
    *hash.as_ref()
}
这可行,但远非理想:
  • 如果RON序列化发生变化,则哈希值也会发生变化。
  • 序列化浪费CPU周期。

  • 在许多类型上都有一个.hash()方法,但这似乎适用于64位非加密哈希(HashMap等)。
    我如何以密码方式哈希任意的Rust结构和枚举,以使散列是相同的,而与体系结构/字大小/字节序无关? (我不使用usize。)

    最佳答案

    如果要使用加密哈希来哈希对象,则必须将其转换为字节流,因为这是加密哈希唯一接受的东西。我们通常将其称为序列化。
    您可以执行以下操作:

  • 查找可以最快的通用序列化格式。 JSON对此不利,因为它无法有效地序列化字节序列,因此您可以尝试CBOR,Msgpack或其他某种二进制格式。
  • 向您的代码中添加测试,这些测试将通用结构散列为期望值,以便您可以验证它们是否按预期工作,并避免意外中断。
  • 如果可能,在哈希中添加一个version字段,因此如果需要更改序列化程序或序列化的字节结构,则可以更改版本。
  • 使用比SHA-256更快的散列,例如SHA-512,SHA-512/256或BLAKE2b(在64位系统上)或BLAKE2s(在32位系统上),以降低整体操作的成本。

  • 或者,您可以尝试构建自定义的Hasher实现,该实现也可以输出SHA-256值。然后,您的结构将需要实现Hash而不是Serialize,并且您将以增量方式进行哈希处理。这可能会或可能不会更快。

    关于rust - Rust结构/枚举的可复制加密哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62979022/

    相关文章:

    rust - xcb:在 EnterNotify 之后立即收到 LeaveNotify

    c# - 使用 SHA256 key 的哈希字符串

    sockets - 如何将Tokio设置为多线程UDP服务器?

    lambda - 传递和评估防 rust 封闭

    c# - 访问 BinaryReader 的内部缓冲区

    在将数据缓冲区映射到其最终数据结构之前,我们能否交换数据缓冲区的字节序,这是一个固定大小的数组?

    iphone - 用memcpy反转字节序

    ios - SHA-256 散列与 key swift

    java - 无法创建正确的 SHA256 哈希值

    scala - 不能将 futures-util crate 与 Actix 一起使用,因为特征 Future 未实现