feat(hash): 添加 Blake2b 哈希算法支持

新增 blake2b 模块,提供多种长度的 Blake2b 哈希计算功能,
包括 224、256、384 和 512 位版本,并支持对字节数组和文件进行哈希计算。
同时支持返回字节数组和十六进制字符串两种格式。
在 Cargo.toml 中添加了 blake2b_simd 依赖以实现该功能。
This commit is contained in:
徐涛
2025-10-09 11:18:58 +08:00
parent a89f9aff15
commit 0697e61f35
3 changed files with 100 additions and 0 deletions

View File

@@ -11,6 +11,7 @@ crate-type = ["dylib", "rlib"]
[dependencies]
aes = "0.8.3"
base64 = "0.21.2"
blake2b_simd = "1.0.3"
blockhash = "0.5.0"
cbc = { version = "0.1.2", features = ["std"] }
chrono = "0.4.26"

97
src/hash/blake2b/mod.rs Normal file
View File

@@ -0,0 +1,97 @@
use blake2b_simd::{blake2b as blake2b_hasher, Params, State};
use std::fs::File;
use std::io::{self, Read};
use std::path::Path;
/// 根据给定的位数返回一个Blake2b散列实例。
fn hasher_select(bit_size: usize) -> State {
match bit_size {
224 => Params::new().hash_length(28).to_state(), // 224 bits = 28 bytes
384 => Params::new().hash_length(48).to_state(), // 384 bits = 48 bytes
512 => Params::new().hash_length(64).to_state(), // 512 bits = 64 bytes
256 | _ => Params::new().hash_length(32).to_state(), // 256 bits = 32 bytes
}
}
/// 计算给定字节数组的Blake2b校验和返回字节数组。
pub fn blake2b(data: &[u8]) -> Vec<u8> {
blake2b_hasher(data).as_bytes().to_vec()
}
/// 计算给定字节数组的Blake2b/256校验和返回字节数组。
pub fn blake2b_256(data: &[u8]) -> Vec<u8> {
let mut hasher = hasher_select(256);
hasher.update(data);
hasher.finalize().as_bytes().to_vec()
}
/// 计算给定字节数组的Blake2b/384校验和返回字节数组。
pub fn blake2b_384(data: &[u8]) -> Vec<u8> {
let mut hasher = hasher_select(384);
hasher.update(data);
hasher.finalize().as_bytes().to_vec()
}
/// 计算给定字节数组的Blake2b/224校验和返回字节数组。
pub fn blake2b_224(data: &[u8]) -> Vec<u8> {
let mut hasher = hasher_select(224);
hasher.update(data);
hasher.finalize().as_bytes().to_vec()
}
/// 计算给定字节数组的Blake2b校验和返回十六进制字符串。
pub fn blake2b_hex(data: &[u8]) -> String {
hex::encode(blake2b(data))
}
/// 计算给定字节数组的Blake2b/256校验和返回十六进制字符串。
pub fn blake2b_256_hex(data: &[u8]) -> String {
hex::encode(blake2b_256(data))
}
/// 计算给定字节数组的Blake2b/384校验和返回十六进制字符串。
pub fn blake2b_384_hex(data: &[u8]) -> String {
hex::encode(blake2b_384(data))
}
/// 计算给定字节数组的Blake2b/224校验和返回十六进制字符串。
pub fn blake2b_224_hex(data: &[u8]) -> String {
hex::encode(blake2b_224(data))
}
/// 根据给定位数计算一个字节数组的Blake2b校验和返回字节数组。
pub fn sum(data: &[u8], bit_size: Option<usize>) -> Vec<u8> {
let size = bit_size.unwrap_or(512);
let mut hasher = hasher_select(size);
hasher.update(data);
hasher.finalize().as_bytes().to_vec()
}
/// 根据给定位数计算一个字节数组的Blake2b校验和返回十六进制字符串。
pub fn sum_hex(data: &[u8], bit_size: Option<usize>) -> String {
hex::encode(sum(data, bit_size))
}
/// 根据给定位数计算一个文件的Blake2b校验和返回字节数组。
pub fn sum_file<P: AsRef<Path>>(file_path: P, bit_size: Option<usize>) -> io::Result<Vec<u8>> {
let size = bit_size.unwrap_or(512);
let mut file = File::open(file_path)?;
let mut hasher = hasher_select(size);
let mut buffer = [0; 8192];
loop {
let bytes_read = file.read(&mut buffer)?;
if bytes_read == 0 {
break;
}
hasher.update(&buffer[..bytes_read]);
}
Ok(hasher.finalize().as_bytes().to_vec())
}
/// 根据给定位数计算一个文件的Blake2b校验和返回十六进制字符串。
pub fn sum_file_hex<P: AsRef<Path>>(file_path: P, bit_size: Option<usize>) -> io::Result<String> {
let hash = sum_file(file_path, bit_size)?;
Ok(hex::encode(hash))
}

View File

@@ -93,3 +93,5 @@ pub mod image_hash {
}
}
}
pub mod blake2b;