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
: 用于哈希条目,可以是ContentHash
或AgentPubKey
AnyDhtHash
: 用于哈希任意DHT数据,可以是ActionHash
或EntryHash
示例代码
以下是内容中提供的示例代码:
基本使用示例
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提供了以下高级功能:
- 同步/异步哈希计算:支持同步(
with_data_sync
)和异步(with_data
)两种计算方式 - 多种哈希类型转换:支持各种哈希类型间的相互转换
- 位置计算:通过
get_loc()
方法获取哈希位置 - 字符串表示:支持从字符串解析和转换为字符串表示
- 复合哈希类型:支持
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);
}
性能建议
- 对于小数据(小于1KB),直接使用
hash()
函数 - 对于大数据,使用
Builder
模式分块处理 - 需要速度时考虑Blake2算法
- 需要最高安全性时使用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
}