Rust结构/枚举的可复制加密散列

Rust结构/枚举的可复制加密散列,rust,endianness,sha256,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);

目前,我正在使用以下代码获取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()
}
发布fn sha256(序列号:T)->[u8;32]{
让str=ron::ser::to_string(&ser).expect(“序列化失败”);
让mut hasher=Sha256::new();
hasher.update(str);
让hash=hasher.finalize();
*hash.as_ref()
}
这是可行的,但远不理想:

  • 如果RON序列化更改,哈希值也将更改
  • 串行化是在浪费CPU周期
在许多类型上都有一个
.hash()
方法,但这似乎适用于64位非加密哈希(HashMap等)


如何以加密方式对任意结构和枚举进行散列,从而使散列在不考虑体系结构/字长/endianess的情况下都是相同的?(我在这些中不使用
usize

如果要使用加密哈希对对象进行哈希,必须将其转换为字节流,因为这是加密哈希唯一可以接受的。我们通常称之为序列化

您可以做一些事情:

  • 找到最快的通用序列化格式。JSON不适合这样做,因为它不能有效地序列化字节序列,所以您可以尝试CBOR、Msgpack或其他一些二进制格式
  • 向代码中添加测试,使公共结构散列到预期值,以便您可以验证它们是否按预期工作,并避免意外中断
  • 如果可能的话,在散列中添加一个version字段,这样,如果需要更改序列化程序或序列化的字节结构,就可以修改版本
  • 使用比SHA-256更快的散列,例如SHA-512、SHA-512/256或BLAKE2b(在64位系统上)或BLAKE2s(在32位系统上),以降低总体操作的成本

或者,您可以尝试构建一个自定义的
哈希器
实现,该实现还可以输出SHA-256值。然后,您的结构将需要实现
散列
,而不是
序列化
,并且您将以增量方式进行散列。这可能更快,也可能更快。

用于HashMap的非加密哈希是否取决于体系结构?如果不是,它们是如何得到字节序列的,我能用同样的方法得到它们吗?可能。您必须查看默认实现是在本机endianness中散列还是在固定的endianness中散列。显示内置哈希(例如i32)不考虑endianness。如果我认为值得的话,我可以复制、修改并粘贴Hash特性的实现到一个新的EndianHash特性中。