feat(hash): 添加 Blake3 哈希算法支持
新增 blake3 模块,提供多种长度的 Blake3 哈希计算功能, 包括 224、256、384 和 512 位输出格式,支持字节数组和文件输入, 并可选择返回字节数组或十六进制字符串。同时在 hash 模块中导出该功能。
This commit is contained in:
@@ -12,6 +12,7 @@ crate-type = ["dylib", "rlib"]
|
||||
aes = "0.8.3"
|
||||
base64 = "0.21.2"
|
||||
blake2b_simd = "1.0.3"
|
||||
blake3 = { version = "1.8.2", features = ["serde", "digest"] }
|
||||
blockhash = "0.5.0"
|
||||
cbc = { version = "0.1.2", features = ["std"] }
|
||||
chrono = "0.4.26"
|
||||
|
109
src/hash/blake3/mod.rs
Normal file
109
src/hash/blake3/mod.rs
Normal file
@@ -0,0 +1,109 @@
|
||||
use blake3::Hasher;
|
||||
use std::fs::File;
|
||||
use std::io::{Read, Result as IoResult};
|
||||
use std::path::Path;
|
||||
|
||||
/// 计算给定字节数组的Blake3/512校验和,返回字节数组。
|
||||
pub fn blake3(data: &[u8]) -> Vec<u8> {
|
||||
let mut hasher = Hasher::new();
|
||||
hasher.update(data);
|
||||
let mut out = vec![0u8, 64];
|
||||
hasher.finalize_xof().fill(&mut out);
|
||||
out
|
||||
}
|
||||
|
||||
/// 计算给定字节数组的Blake3/256校验和,返回字节数组。
|
||||
pub fn blake3_256(data: &[u8]) -> Vec<u8> {
|
||||
let mut hasher = Hasher::new();
|
||||
hasher.update(data);
|
||||
hasher.finalize().as_bytes().to_vec()
|
||||
}
|
||||
|
||||
/// 计算给定字节数组的Blake3/384校验和,返回字节数组。
|
||||
pub fn blake3_384(data: &[u8]) -> Vec<u8> {
|
||||
let mut hasher = Hasher::new();
|
||||
hasher.update(data);
|
||||
let mut out = vec![0u8, 48];
|
||||
hasher.finalize_xof().fill(&mut out);
|
||||
out
|
||||
}
|
||||
|
||||
/// 计算给定字节数组的Blake3/224校验和,返回字节数组。
|
||||
pub fn blake3_224(data: &[u8]) -> Vec<u8> {
|
||||
let mut hasher = Hasher::new();
|
||||
hasher.update(data);
|
||||
let mut out = vec![0u8, 28];
|
||||
hasher.finalize_xof().fill(&mut out);
|
||||
out
|
||||
}
|
||||
|
||||
/// 计算给定字节数组的Blake3校验和,返回十六进制字符串。
|
||||
pub fn blake3_hex(data: &[u8]) -> String {
|
||||
hex::encode(blake3(data))
|
||||
}
|
||||
|
||||
/// 计算给定字节数组的Blake3/256校验和,返回十六进制字符串。
|
||||
pub fn blake3_256_hex(data: &[u8]) -> String {
|
||||
hex::encode(blake3_256(data))
|
||||
}
|
||||
|
||||
/// 计算给定字节数组的Blake3/384校验和,返回十六进制字符串。
|
||||
pub fn blake3_384_hex(data: &[u8]) -> String {
|
||||
hex::encode(blake3_384(data))
|
||||
}
|
||||
|
||||
/// 计算给定字节数组的Blake3/224校验和,返回十六进制字符串。
|
||||
pub fn blake3_224_hex(data: &[u8]) -> String {
|
||||
hex::encode(blake3_224(data))
|
||||
}
|
||||
|
||||
/// 根据给定位数计算一个字节数组的Blake3校验和,返回字节数组。
|
||||
pub fn sum(data: &[u8], bit_size: Option<usize>) -> Vec<u8> {
|
||||
match bit_size {
|
||||
Some(bit_size) => match bit_size {
|
||||
224 => blake3_224(data),
|
||||
256 => blake3_256(data),
|
||||
384 => blake3_384(data),
|
||||
512 | _ => blake3(data),
|
||||
},
|
||||
None => blake3(data),
|
||||
}
|
||||
}
|
||||
|
||||
/// 根据给定位数计算一个字节数组的Blake3校验和,返回十六进制字符串。
|
||||
pub fn sum_hex(data: &[u8], bit_size: Option<usize>) -> String {
|
||||
hex::encode(sum(data, bit_size))
|
||||
}
|
||||
|
||||
/// 根据给定位数计算一个文件的Blake3校验和,返回字节数组。
|
||||
pub fn sum_file<P: AsRef<Path>>(file: P, bit_size: Option<usize>) -> IoResult<Vec<u8>> {
|
||||
let mut f = File::open(file)?;
|
||||
let mut hasher = Hasher::new();
|
||||
|
||||
let mut buffer = [0; 8192];
|
||||
loop {
|
||||
let bytes_read = f.read(&mut buffer)?;
|
||||
if bytes_read == 0 {
|
||||
break;
|
||||
}
|
||||
hasher.update(&buffer[..bytes_read]);
|
||||
}
|
||||
|
||||
let mut out = match bit_size {
|
||||
Some(bit_size) => match bit_size {
|
||||
224 => vec![0u8, 28],
|
||||
256 => vec![0u8, 32],
|
||||
384 => vec![0u8, 48],
|
||||
512 | _ => vec![0u8, 64],
|
||||
},
|
||||
None => vec![0u8, 64],
|
||||
};
|
||||
hasher.finalize_xof().fill(&mut out);
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
/// 根据给定位数计算一个文件的Blake3校验和,返回十六进制字符串。
|
||||
pub fn sum_file_hex<P: AsRef<Path>>(file: P, bit_size: Option<usize>) -> IoResult<String> {
|
||||
let hash = sum_file(file, bit_size)?;
|
||||
Ok(hex::encode(hash))
|
||||
}
|
@@ -95,3 +95,4 @@ pub mod image_hash {
|
||||
}
|
||||
|
||||
pub mod blake2b;
|
||||
pub mod blake3;
|
||||
|
Reference in New Issue
Block a user