如何为Rust第三方库的impl Hash计算SHA1/SHA3加密哈希?
在Rust中为实现
Hash的类型计算加密哈希 核心思路
标准库的Hasher trait因设计定位(返回u64)确实不适合加密场景,但可以通过包装器模式将加密哈希器适配为Hasher,同时保留获取完整加密哈希的能力,也有现成第三方库提供这类适配。
手动实现适配示例
以SHA1为例,基于sha1 crate编写包装器:
use sha1::Sha1; use std::hash::{Hash, Hasher}; // 包装Sha1哈希器,实现Hasher trait struct Sha1Hasher(Sha1); impl Hasher for Sha1Hasher { // 将数据写入加密哈希器 fn write(&mut self, bytes: &[u8]) { self.0.update(bytes); } // 仅满足Hasher trait要求,返回哈希的前8字节(实际业务可忽略该返回值) fn finish(&self) -> u64 { let hash = self.0.clone().finalize(); u64::from_be_bytes(hash[0..8].try_into().unwrap()) } } impl Sha1Hasher { // 创建新的哈希器实例 fn new() -> Self { Sha1Hasher(Sha1::new()) } // 自定义方法,返回完整的SHA1哈希值 fn finalize(&self) -> [u8; 20] { self.0.clone().finalize() } } // 封装工具函数,给任意实现Hash的类型计算SHA1 fn compute_sha1<T: Hash>(value: &T) -> [u8; 20] { let mut hasher = Sha1Hasher::new(); value.hash(&mut hasher); hasher.finalize() }
现成第三方库适配
部分库直接提供Hasher与加密哈希的适配:
hash_hasher:支持将实现digest::Digesttrait的加密哈希器(如sha3::Sha3_256)适配为Hasher,同时可获取完整哈希值。cryptographic-hasher:专门为加密哈希实现了Hashertrait,可直接配合Hashtrait使用。
关键说明
这类适配的核心是让实现Hash的类型通过标准hash()方法喂数据给加密哈希器,再通过自定义方法绕过Hasher::finish()的u64限制,获取完整加密哈希结果。
内容的提问来源于stack exchange,提问作者Timmmm
相关产品推荐
相关产品推荐

