gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:45:09 24 4
gpt4 key购买 nike

目前,我正在使用以下代码来获取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/

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