Rust高性能哈希算法库fastmurmur3的使用,fastmurmur3提供快速MurmurHash3实现用于数据校验和哈希计算
Rust高性能哈希算法库fastmurmur3的使用
fastmurmur3是一个快速的MurmurHash3实现库,用于数据校验和哈希计算。根据测试,它是目前最快的Murmur3实现。
安装
在Cargo.toml中添加依赖:
fastmurmur3 = "0.2.0"
或者运行命令安装:
cargo add fastmurmur3
基本用法
内容中提供的示例代码:
let bytes: &[u8] = b"hello world";
let x: u128 = fastmurmur3::hash(bytes);
完整示例
use fastmurmur3;
fn main() {
// 计算字符串的哈希
let data = b"hello world";
let hash_value: u128 = fastmurmur3::hash(data);
println!("Hash of 'hello world': {}", hash_value);
// 计算字节数组的哈希
let bytes = vec![1, 2, 3, 4, 5];
let bytes_hash: u128 = fastmurmur3::hash(&bytes);
println!("Hash of [1,2,3,4,5]: {}", bytes_hash);
}
性能对比
根据基准测试:
fastmurmur3
是最快的实现xxh3_64
慢1.66倍且只有64位值xxh3_128
慢2.50倍fasthash
中的Murmur3实现比fastmurmur3
慢4.47倍
具体测试数据:
fastmurmur3 time: [3.0878 ns 3.1215 ns 3.1619 ns]
xxhash_rust::xxh3_64 time: [5.1473 ns 5.1872 ns 5.2456 ns]
xxhash_rust::xxh3_128 time: [7.8066 ns 7.8271 ns 7.8499 ns]
fasthash time: [13.909 ns 13.960 ns 14.018 ns]
murmur3c time: [14.529 ns 14.604 ns 14.684 ns]
murmur3 time: [26.084 ns 26.163 ns 26.249 ns]
正确性
fastmurmur3
的测试通过与C实现的对比进行了模糊测试,确保其正确性。
许可证
该项目使用MIT许可证。
1 回复
Rust高性能哈希算法库fastmurmurm3的使用指南
简介
fastmurmur3是一个Rust实现的MurmurHash3算法库,专注于提供高性能的哈希计算功能。MurmurHash3是一种非加密型哈希函数,适用于一般的哈希检索操作,具有很好的随机分布性和较快的计算速度。
安装
在Cargo.toml中添加依赖:
[dependencies]
fastmurmur3 = "0.2"
基本使用方法
计算32位哈希值
use fastmurmur3::murmur3_x86_32;
fn main() {
let data = b"hello world";
let seed = 0; // 可选的种子值
let hash = murmur3_x86_32(data, seed);
println!("32-bit hash: {:x}", hash);
}
计算128位哈希值
use fastmurmur3::murmur3_x64_128;
fn main() {
let data = b"hello world";
let seed = 0;
let hash = murmur3_x64_128(data, seed);
println!("128-bit hash: {:x?}", hash);
}
高级用法
处理大文件或流数据
use fastmurmur3::murmur3_x86_32;
use std::io::Read;
fn hash_file(path: &str) -> std::io::Result<u32> {
let mut file = std::fs::File::open(path)?;
let mut hasher = murmur3_x86_32::Hasher::with_seed(0);
let mut buffer = [0; 4096];
loop {
let count = file.read(&mut buffer)?;
if count == 0 {
break;
}
hasher.write(&buffer[..count]);
}
Ok(hasher.finish())
}
自定义种子值
use fastmurmur3::murmur3_x86_32;
fn main() {
let data = b"hello world";
for seed in 0..5 {
let hash = murmur3_x86_32(data, seed);
println!("Seed {}: {:x}", seed, hash);
}
}
完整示例
下面是一个完整的使用示例,包含了上述所有功能:
use fastmurmur3::{murmur3_x86_32, murmur3_x64_128};
use std::io::Read;
fn main() {
// 示例1: 计算32位哈希
let data = b"hello world";
let hash32 = murmur3_x86_32(data, 0);
println!("32-bit hash of 'hello world': {:x}", hash32);
// 示例2: 计算128位哈希
let hash128 = murmur3_x64_128(data, 0);
println!("128-bit hash of 'hello world': {:x?}", hash128);
// 示例3: 文件哈希计算
if let Ok(hash) = hash_file("example.txt") {
println!("File hash: {:x}", hash);
} else {
eprintln!("Failed to read file");
}
// 示例4: 不同种子值测试
println!("\nTesting different seeds:");
for seed in 0..3 {
let hash = murmur3_x86_32(data, seed);
println!("Seed {}: {:x}", seed, hash);
}
}
fn hash_file(path: &str) -> std::io::Result<u32> {
let mut file = std::fs::File::open(path)?;
let mut hasher = murmur3_x86_32::Hasher::with_seed(0);
let mut buffer = [0; 4096];
loop {
let count = file.read(&mut buffer)?;
if count == 0 {
break;
}
hasher.write(&buffer[..count]);
}
Ok(hasher.finish())
}
性能提示
- 对于小数据块(几十字节),32位版本通常更快
- 对于大数据块(几百字节以上),128位版本可能更高效
- 在x86架构上,32位版本通常比64位版本快
- 在x64架构上,128位版本可能比32位版本更快
使用场景
- 数据校验
- 哈希表实现
- 布隆过滤器
- 缓存键生成
- 数据分片
注意事项
- MurmurHash3不是加密安全的哈希函数
- 不同架构上的哈希结果可能不同
- 对于相同输入,使用相同种子会得到相同输出