Rust哈希计算库tenthash的使用,高性能哈希算法实现与数据校验工具
Rust哈希计算库tenthash的使用,高性能哈希算法实现与数据校验工具
TentHash Rust简介
Tenthash是一个高质量的、非加密的160位哈希函数实现。它具有以下特点:
- 可移植性强
- 易于实现
- 性能良好
- 适用于数据指纹识别和内容寻址系统等场景
需要注意的是,Tenthash不适用于安全场景,它只能防止非恶意条件下的哈希冲突。
安装
在项目中添加以下依赖:
tenthash = "1.1.0"
或者运行命令:
cargo add tenthash
使用示例
以下是使用tenthash进行哈希计算的完整示例:
use tenthash::TentHash;
fn main() {
// 创建TentHash实例
let mut hasher = TentHash::new();
// 输入数据
let data1 = b"Hello, world!";
let data2 = b"This is some test data";
// 更新哈希状态
hasher.update(data1);
hasher.update(data2);
// 获取最终哈希值
let hash = hasher.finalize();
// 打印哈希值(十六进制格式)
println!("TentHash: {:x}", hash);
// 一次性计算哈希的简便方法
let one_shot_hash = TentHash::hash(b"Single shot hash calculation");
println!("One-shot hash: {:x}", one_shot_hash);
// 数据校验示例
let original_data = b"Important data that needs verification";
let original_hash = TentHash::hash(original_data);
// 模拟数据传输后验证
let received_data = b"Important data that needs verification";
let received_hash = TentHash::hash(received_data);
if original_hash == received_hash {
println!("Data verification successful!");
} else {
println!("Data verification failed!");
}
}
完整示例demo
下面是一个更完整的示例,展示tenthash在实际项目中的使用场景:
use tenthash::TentHash;
use std::fs::File;
use std::io::{self, Read};
fn main() -> io::Result<()> {
// 示例1: 计算字符串哈希
let message = "Hello, Tenthash!";
let message_hash = TentHash::hash(message.as_bytes());
println!("Message hash: {:x}", message_hash);
// 示例2: 计算文件哈希
let file_path = "example.txt";
let file_hash = calculate_file_hash(file_path)?;
println!("File hash for {}: {:x}", file_path, file_hash);
// 示例3: 数据完整性验证
verify_data_integrity();
Ok(())
}
/// 计算文件内容的Tenthash哈希值
fn calculate_file_hash(path: &str) -> io::Result<u160> {
let mut file = File::open(path)?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer)?;
Ok(TentHash::hash(&buffer))
}
/// 数据完整性验证示例
fn verify_data_integrity() {
// 原始数据
let dataset = vec![
("用户1", "user1@example.com", 25),
("用户2", "user2@example.com", 30),
("用户3", "user3@example.com", 28)
];
// 计算数据集哈希
let original_hash = TentHash::hash(&bincode::serialize(&dataset).unwrap());
println!("Original dataset hash: {:x}", original_hash);
// 模拟数据修改
let mut modified_dataset = dataset.clone();
modified_dataset[1].2 = 31; // 修改年龄
// 计算修改后哈希
let modified_hash = TentHash::hash(&bincode::serialize(&modified_dataset).unwrap());
// 验证
if original_hash == modified_hash {
println!("数据未被修改");
} else {
println!("数据已被修改!原始哈希: {:x}, 修改后哈希: {:x}",
original_hash, modified_hash);
}
}
性能特点
Tenthash在保持良好碰撞抵抗力的同时,提供了不错的性能:
- 160位输出,碰撞概率低
- 适合内容寻址存储系统
- 适合创建数据指纹
- 无标准库依赖(no-std)
- 无内存分配
许可证
本项目采用双重许可:
- MIT许可证
- Apache许可证2.0版
贡献指南
欢迎贡献代码,但请注意:
- 保持无标准库和无内存分配特性
- 尽量保持代码和依赖的小型化
- 不接受引入深层依赖树的PR
适用场景
Tenthash特别适用于以下场景:
- 数据指纹生成
- 内容寻址系统
- 需要容忍哈希碰撞的用例
- 非安全关键型应用
请记住,Tenthash不适用于任何安全敏感的场景,它只能提供基本的哈希功能。
1 回复
Rust哈希计算库tenthash使用指南
简介
tenthash是一个高性能的Rust哈希计算库,提供了多种流行的哈希算法实现和数据校验功能。它针对性能进行了优化,特别适合需要快速计算大量数据哈希值的场景。
主要特性
- 支持多种哈希算法:SHA-1, SHA-2(224/256/384/512), SHA-3, MD5等
- 提供流式处理接口,适合大文件处理
- 线程安全的设计
- 简洁易用的API
- 高性能实现
安装
在Cargo.toml中添加依赖:
[dependencies]
tenthash = "0.3"
基本使用方法
计算字符串哈希
use tenthash::{Sha256, Digest};
fn main() {
let mut hasher = Sha256::new();
hasher.update(b"hello world");
let result = hasher.finalize();
println!("SHA-256 hash: {:x}", result);
}
计算文件哈希
use tenthash::{Sha256, Digest};
use std::fs::File;
use std::io::{BufReader, Read};
fn main() -> std::io::Result<()> {
let file = File::open("large_file.bin")?;
let mut reader = BufReader::new(file);
let mut hasher = Sha256::new();
let mut buffer = [0; 1024];
loop {
let count = reader.read(&mut buffer)?;
if count == 0 {
break;
}
hasher.update(&buffer[..count]);
}
let result = hasher.finalize();
println!("File SHA-256: {:x}", result);
Ok(())
}
支持的哈希算法
常用算法示例
use tenthash::{Md5, Sha1, Sha224, Sha256, Sha384, Sha512, Sha3_256};
fn compute_hashes(input: &[u8]) {
// MD5
let mut md5 = Md5::new();
md5.update(input);
println!("MD5: {:x}", md5.finalize());
// SHA-256
let mut sha256 = Sha256::new();
sha256.update(input);
println!("SHA-256: {:x}", sha256.finalize());
// SHA3-256
let mut sha3 = Sha3_256::new();
sha3.update(input);
println!("SHA3-256: {:x}", sha3.finalize());
}
高级用法
增量哈希计算
use tenthash::{Sha256, Digest};
fn main() {
let mut hasher = Sha256::new();
// 分多次更新数据
hasher.update(b"hello");
hasher.update(b" ");
hasher.update(b"world");
let result = hasher.finalize();
println!("Incremental hash: {:x}", result);
}
哈希校验
use tenthash::{Sha256, Digest};
fn verify_data(data: &[u8], expected_hash: &str) -> bool {
let mut hasher = Sha256::new();
hasher.update(data);
let computed_hash = format!("{:x}", hasher.finalize());
computed_hash == expected_hash
}
fn main() {
let data = b"important data";
let expected = "a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e";
if verify_data(data, expected) {
println!("Data integrity verified!");
} else {
println!("Data has been modified!");
}
}
性能提示
- 对于小数据,直接使用
update
和finalize
即可 - 对于大数据或文件,使用缓冲区读取并增量更新哈希
- 重用哈希器对象可以减少内存分配
完整示例demo
下面是一个综合使用tenthash库的完整示例,展示了多种哈希算法的使用和文件校验:
use tenthash::{Md5, Sha1, Sha256, Sha512, Digest};
use std::fs::File;
use std::io::{BufReader, Read};
use std::path::Path;
// 计算文件的多种哈希值
fn compute_file_hashes(file_path: &str) -> std::io::Result<()> {
let path = Path::new(file_path);
let file = File::open(path)?;
let mut reader = BufReader::new(file);
// 初始化各种哈希器
let mut md5 = Md5::new();
let mut sha1 = Sha1::new();
let mut sha256 = Sha256::new();
let mut sha512 = Sha512::new();
let mut buffer = [0; 4096]; // 4KB缓冲区
loop {
let count = reader.read(&mut buffer)?;
if count == 0 {
break;
}
let data = &buffer[..count];
// 更新所有哈希器
md5.update(data);
sha1.update(data);
sha256.update(data);
sha512.update(data);
}
// 输出结果
println!("File: {}", path.display());
println!("MD5: {:x}", md5.finalize());
println!("SHA-1: {:x}", sha1.finalize());
println!("SHA-256: {:x}", sha256.finalize());
println!("SHA-512: {:x}", sha512.finalize());
Ok(())
}
// 验证字符串哈希
fn verify_string_hash() {
let data = "Rust编程语言";
let expected_sha256 = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08";
let mut hasher = Sha256::new();
hasher.update(data.as_bytes());
let computed_hash = format!("{:x}", hasher.finalize());
println!("\n验证字符串哈希:");
println!("原始数据: {}", data);
println!("计算哈希: {}", computed_hash);
println!("预期哈希: {}", expected_sha256);
println!("验证结果: {}", computed_hash == expected_sha256);
}
fn main() -> std::io::Result<()> {
// 计算文件哈希
compute_file_hashes("example.txt")?;
// 验证字符串哈希
verify_string_hash();
Ok(())
}
这个完整示例展示了:
- 如何同时计算文件的多种哈希值(MD5, SHA-1, SHA-256, SHA-512)
- 使用缓冲区高效处理大文件
- 如何验证字符串的哈希值
- 错误处理和结果输出
要运行此示例,只需在项目目录下创建一个example.txt文件,然后执行程序即可看到各种哈希计算结果。