You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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::Digest trait的加密哈希器(如sha3::Sha3_256)适配为Hasher,同时可获取完整哈希值。
  • cryptographic-hasher:专门为加密哈希实现了Hasher trait,可直接配合Hash trait使用。

关键说明

这类适配的核心是让实现Hash的类型通过标准hash()方法喂数据给加密哈希器,再通过自定义方法绕过Hasher::finish()的u64限制,获取完整加密哈希结果。

内容的提问来源于stack exchange,提问作者Timmmm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:02:37