Rust哈希处理库holo_hash的使用,holo_hash提供高效安全的哈希计算与数据完整性验证功能

Rust哈希处理库holo_hash的使用

holo_hash是Holochain的哈希框架,提供高效安全的哈希计算与数据完整性验证功能。

哈希类型

HoloHash有多种哈希类型,分为两类:原始类型复合类型

原始哈希类型

每种原始哈希类型都有一个独特的三字节前缀:

哈希类型 HoloHash别名 前缀
Agent AgentPubKey uhCAk
Entry EntryHash uhCEk
DhtOp DhtOpHash uhCQk
Dna DnaHash uhC0k
NetId NetIdHash uhCIk
Action ActionHash uhCkk
Wasm DnaWasmHash uhCok

复合哈希类型

复合哈希类型用于多种原始哈希类型都有效的情况:

  • EntryHash: 用于哈希条目,可以是ContentHashAgentPubKey
  • AnyDhtHash: 用于哈希任意DHT数据,可以是ActionHashEntryHash

示例代码

以下是内容中提供的示例代码:

基本使用示例

use holo_hash::*;
use std::convert::TryInto;
use holochain_serialized_bytes::SerializedBytes;

// 从字符串创建EntryHash
let entry: EntryHash = 
    "uhCEkWCsAgoKkkfwyJAglj30xX_GLLV-3BXuFy436a2SqpcEwyBzm"
    .try_into()
    .unwrap();

assert_eq!(3860645936, entry.get_loc());

// 转换为SerializedBytes
let bytes: SerializedBytes = entry.try_into().unwrap();

assert_eq!(
    "{\"type\":\"EntryHash\",\"hash\":[88,43,0,130,130,164,145,252,50,36,8,37,143,125,49,95,241,139,45,95,183,5,123,133,203,141,250,107,100,170,165,193,48,200,28,230]}",
    &format!("{:?}", bytes),
);

计算哈希示例

use holo_hash::*;

let entry_content = b"test entry content";

// 同步计算哈希
let content_hash = EntryHash::with_data_sync(entry_content.to_vec()).into();

assert_eq!(
    "EntryHash(uhCEkhPbA5vaw3Fk-ZvPSKuyyjg8eoX98fve75qiUEFgAE3BO7D4d)",
    &format!("{:?}", content_hash),
);

特殊案例(不重新哈希)

use holo_hash::*;

// 假设我们的公钥都是0xdb字节
let agent_pub_key = vec![0xdb; 32];

let agent_id: HoloHash = AgentPubKey::from_raw_32(agent_pub_key).into();

assert_eq!(
    "AgentPubKey(uhCAk29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uTp5Iv)",
    &format!("{:?}", agent_id),
);

完整示例代码

基于提供的示例,下面是一个更完整的演示示例:

use holo_hash::*;
use std::convert::TryInto;
use futures::executor::block_on;

// 异步哈希计算函数
async fn compute_async_hash(data: Vec<u8>) -> EntryHash {
    EntryHash::with_data(data).await
}

fn main() {
    // 示例1: 从字符串解析不同哈希类型
    let action_hash: ActionHash = 
        "uhCkkXCsAgoKkkfwyJAglj30xX_GLLV-3BXuFy436a2SqpcEwyBzm"
        .try_into()
        .unwrap();
    println!("解析ActionHash: {:?}", action_hash);
    
    let dna_hash: DnaHash = 
        "uhC0kXCsAgoKkkfwyJAglj30xX_GLLV-3BXuFy436a2SqpcEwyBzm"
        .try_into()
        .unwrap();
    println!("解析DnaHash: {:?}", dna_hash);

    // 示例2: 计算数据哈希
    let data1 = b"Hello, HoloHash!".to_vec();
    let entry_hash1 = EntryHash::with_data_sync(data1.clone());
    println!("同步计算EntryHash: {:?}", entry_hash1);
    
    // 示例3: 异步计算哈希
    let data2 = b"Async hash computation".to_vec();
    let entry_hash2 = block_on(compute_async_hash(data2.clone()));
    println!("异步计算EntryHash: {:?}", entry_hash2);

    // 示例4: 获取哈希位置和字符串表示
    println!("哈希位置: {}", entry_hash1.get_loc());
    let hash_str = entry_hash1.to_string();
    println!("字符串表示: {}", hash_str);
    
    // 示例5: 从字符串重建哈希
    let rebuilt_hash: EntryHash = hash_str.try_into().unwrap();
    println!("重建哈希匹配: {}", rebuilt_hash == entry_hash1);
    
    // 示例6: 特殊案例 - 不重新哈希
    let agent_pub_key = vec![0xdb; 32];
    let agent_id: HoloHash = AgentPubKey::from_raw_32(agent_pub_key).into();
    println!("特殊案例(不重新哈希): {:?}", agent_id);
    
    // 示例7: 复合哈希类型使用
    let any_dht_hash: AnyDhtHash = entry_hash1.into();
    println!("复合哈希类型AnyDhtHash: {:?}", any_dht_hash);
}

高级特性

holo_hash提供了以下高级功能:

  1. 同步/异步哈希计算:支持同步(with_data_sync)和异步(with_data)两种计算方式
  2. 多种哈希类型转换:支持各种哈希类型间的相互转换
  3. 位置计算:通过get_loc()方法获取哈希位置
  4. 字符串表示:支持从字符串解析和转换为字符串表示
  5. 复合哈希类型:支持AnyDhtHash等复合类型处理多种哈希情况

holo_hash是Holochain生态系统的核心组件,提供了高效且安全的哈希计算功能,适用于需要数据完整性验证的各种场景。


1 回复

Rust哈希处理库holo_hash的使用指南

概述

holo_hash是一个Rust实现的哈希处理库,专注于提供高效且安全的哈希计算与数据完整性验证功能。它支持多种哈希算法,并提供了简单易用的API接口。

主要特性

  • 支持多种哈希算法(SHA-256, SHA-512, Blake2等)
  • 高性能计算优化
  • 内存安全保证
  • 数据完整性验证
  • 简单易用的API设计

安装方法

在Cargo.toml中添加依赖:

[dependencies]
holo_hash = "0.7"

基本使用方法

计算哈希值

use holo_hash::{sha256, sha512, blake2b};

fn main() {
    let data = b"hello world";
    
    // SHA-256哈希
    let sha256_hash = sha256::hash(data);
    println!("SHA-256: {:x}", sha256_hash);
    
    // SHA-512哈希
    let sha512_hash = sha512::hash(data);
    println!("SHA-512: {:x}", sha512_hash);
    
    // Blake2b哈希
    let blake2b_hash = blake2b::hash(data);
    println!("Blake2b: {:x}", blake2b_hash);
}

验证数据完整性

use holo_hash::sha256;

fn verify_data(original_data: &[u8], received_hash: &[u8]) -> bool {
    let computed_hash = sha256::hash(original_data);
    computed_hash.as_ref() == received_hash
}

fn main() {
    let data = b"important data";
    let original_hash = sha256::hash(data);
    
    // 模拟接收到的数据
    let received_data = b"important data";
    
    if verify_data(received_data, original_hash.as_ref()) {
        println!("数据完整性验证通过");
    } else {
        println!("数据已被篡改!");
    }
}

高级用法

使用哈希构建器

use holo_hash::{Sha256Builder, Digest};

fn main() {
    let mut builder = Sha256Builder::new();
    
    // 分块处理大数据
    builder.update(b"第一部分数据");
    builder.update(b"第二部分数据");
    builder.update(b"第三部分数据");
    
    let final_hash = builder.finalize();
    println!("分段计算哈希: {:x}", final_hash);
}

自定义哈希长度

use holo_hash::blake2b;

fn main() {
    let data = b"variable length hash";
    
    // 生成256位的Blake2b哈希
    let hash_256 = blake2b::hash_with_size(data, 32);
    println!("256-bit hash: {:x}", hash_256);
    
    // 生成128位的Blake2b哈希
    let hash_128 = blake2b::hash_with_size(data, 16);
    println!("128-bit hash: {:x}", hash_128);
}

性能建议

  1. 对于小数据(小于1KB),直接使用hash()函数
  2. 对于大数据,使用Builder模式分块处理
  3. 需要速度时考虑Blake2算法
  4. 需要最高安全性时使用SHA-512

注意事项

  • 哈希值比较时应该使用恒定时间比较函数来防止时序攻击
  • 选择哈希算法时应根据安全需求而非性能
  • 敏感数据哈希应该配合加盐使用

完整示例代码

use holo_hash::{sha256, sha512, blake2b, Sha256Builder, Digest};

fn main() {
    // 示例1: 基本哈希计算
    let data = b"hello holo_hash";
    println!("\n基本哈希计算示例:");
    
    let sha256_hash = sha256::hash(data);
    println!("SHA-256: {:x}", sha256_hash);
    
    let sha512_hash = sha512::hash(data);
    println!("SHA-512: {:x}", sha512_hash);
    
    let blake2b_hash = blake2b::hash(data);
    println!("Blake2b: {:x}", blake2b_hash);

    // 示例2: 数据完整性验证
    println!("\n数据完整性验证示例:");
    
    let original_data = b"important message";
    let original_hash = sha256::hash(original_data);
    
    // 模拟接收到的数据(未被篡改)
    let received_data_good = b"important message";
    
    // 模拟接收到的数据(已被篡改)
    let received_data_bad = b"important messag3";
    
    println!("原始数据哈希: {:x}", original_hash);
    
    if verify_data(received_data_good, original_hash.as_ref()) {
        println!("未篡改数据验证通过");
    } else {
        println!("未篡改数据验证失败");
    }
    
    if verify_data(received_data_bad, original_hash.as_ref()) {
        println!("已篡改数据验证通过 - 异常!");
    } else {
        println!("已篡改数据验证失败 - 正常!");
    }

    // 示例3: 使用哈希构建器处理大数据
    println!("\n哈希构建器示例:");
    
    let mut builder = Sha256Builder::new();
    builder.update(b"This is a large data chunk 1");
    builder.update(b"This is a large data chunk 2");
    builder.update(b"This is a large data chunk 3");
    
    let built_hash = builder.finalize();
    println!("构建器计算的哈希: {:x}", built_hash);

    // 示例4: 自定义哈希长度
    println!("\n自定义哈希长度示例:");
    
    let custom_data = b"custom length hash data";
    let hash_224 = blake2b::hash_with_size(custom_data, 28); // 224位
    let hash_384 = blake2b::hash_with_size(custom_data, 48); // 384位
    
    println!("224-bit Blake2b: {:x}", hash_224);
    println!("384-bit Blake2b: {:x}", hash_384);
}

fn verify_data(original_data: &[u8], received_hash: &[u8]) -> bool {
    let computed_hash = sha256::hash(original_data);
    computed_hash.as_ref() == received_hash
}
回到顶部