Rust哈希计算库murmur2的使用,murmur2提供高性能非加密哈希算法实现

Rust哈希计算库murmur2的使用,murmur2提供高性能非加密哈希算法实现

murmur2是一个Rust实现的MurmurHash2非加密哈希算法库,提供高性能的哈希计算功能。

安装

在项目目录中运行以下Cargo命令:

cargo add murmur2

或者在Cargo.toml中添加:

murmur2 = "0.1.0"

使用示例

以下是使用murmur2库计算哈希值的完整示例:

use murmur2::murmur2;

fn main() {
    // 要计算哈希的数据
    let data = b"Hello, world!";
    
    // 计算32位哈希值
    let hash = murmur2(data, 0);
    
    println!("Murmur2 hash of 'Hello, world!': {}", hash);
    
    // 使用不同的种子值
    let hash_with_seed = murmur2(data, 12345);
    println!("Murmur2 hash with seed 12345: {}", hash_with_seed);
}

完整示例demo

下面是更完整的示例,展示如何在不同场景下使用murmur2哈希库:

use murmur2::murmur2;

fn main() {
    // 示例1: 计算字符串哈希
    let string_data = "Rust programming language";
    let string_hash = murmur2(string_data.as_bytes(), 0);
    println!("String hash: {}", string_hash);

    // 示例2: 计算字节数组哈希
    let byte_data: [u8; 5] = [0x01, 0x02, 0x03, 0x04, 0x05];
    let byte_hash = murmur2(&byte_data, 0);
    println!("Byte array hash: {}", byte_hash);

    // 示例3: 使用种子值创建不同的哈希
    let data = "same data";
    let seed1 = 42;
    let seed2 = 1024;
    
    let hash1 = murmur2(data.as_bytes(), seed1);
    let hash2 = murmur2(data.as_bytes(), seed2);
    
    println!("Same data with different seeds:");
    println!("Seed {}: {}", seed1, hash1);
    println!("Seed {}: {}", seed2, hash2);

    // 示例4: 用于哈希表场景
    let keys = ["apple", "banana", "cherry"];
    let mut hash_values = Vec::new();
    
    for key in keys.iter() {
        hash_values.push(murmur2(key.as_bytes(), 0));
    }
    
    println!("Hashes for hash table keys:");
    for (key, hash) in keys.iter().zip(hash_values.iter()) {
        println!("{}: {}", key, hash);
    }
}

特性

  • 高性能的非加密哈希算法
  • 支持32位哈希输出
  • 可配置的种子值
  • 适用于哈希表、布隆过滤器等场景

所有权

该库由jcaesar开发和维护。


1 回复

Rust哈希计算库murmur2的使用

murmur2是一个Rust实现的MurmurHash2非加密哈希算法库,它提供了高性能的哈希计算功能,适用于需要快速哈希但不需要加密安全性的场景。

特点

  • 高性能:MurmurHash2算法设计用于快速哈希计算
  • 非加密:不适用于安全敏感场景
  • 一致性:相同输入总是产生相同输出
  • 低碰撞率:良好的哈希分布特性

使用方法

添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
murmur2 = "0.1"

基本使用示例

use murmur2::murmur2;

fn main() {
    let data = b"hello world";
    let seed = 0; // 可选种子值
    
    // 计算哈希值
    let hash = murmur2(data, seed);
    
    println!("Murmur2 hash of 'hello world': {}", hash);
}

32位和64位版本

murmur2库提供了32位和64位两种哈希实现:

use murmur2::{murmur2_32, murmur2_64};

fn main() {
    let data = b"example data";
    
    let hash32 = murmur2_32(data, 0);
    let hash64 = murmur2_64(data, 0);
    
    println!("32-bit hash: {}", hash32);
    println!("64-bit hash: {}", hash64);
}

处理不同类型的数据

use murmur2::murmur2;

fn main() {
    // 字符串哈希
    let s = "Rust programming";
    let hash_str = murmur2(s.as_bytes(), 123);
    
    // 数值哈希
    let num = 42u32;
    let hash_num = murmur2(&num.to_le_bytes(), 0);
    
    println!("String hash: {}", hash_str);
    println!("Number hash: {}", hash_num);
}

在HashMap中使用

use std::collections::HashMap;
use murmur2::murmur2;

#[derive(Hash)]
struct Key {
    id: u32,
    name: String,
}

impl Key {
    fn custom_hash(&self) -> u32 {
        let id_hash = murmur2(&self.id.to_le_bytes(), 0);
        let name_hash = murmur2(self.name.as_bytes(), 0);
        id_hash ^ name_hash
    }
}

fn main() {
    let mut map = HashMap::new();
    let key = Key {
        id: 1,
        name: "example".to_string(),
    };
    
    map.insert(key.custom_hash(), "value");
    
    println!("Map: {:?}", map);
}

完整示例Demo

下面是一个综合使用murmur2库的完整示例,展示了不同场景下的哈希计算:

use murmur2::{murmur2, murmur2_32, murmur2_64};
use std::collections::HashMap;

fn main() {
    // 1. 基本使用示例
    let data = b"hello world";
    let hash = murmur2(data, 0);
    println!("Basic hash: {}", hash);

    // 2. 32位和64位版本比较
    let sample_data = b"sample data for comparison";
    println!("\n32-bit hash: {}", murmur2_32(sample_data, 0));
    println!("64-bit hash: {}", murmur2_64(sample_data, 0));

    // 3. 不同类型数据哈希
    println!("\nDifferent data types:");
    // 字符串
    let s = "Rust is awesome";
    println!("String hash: {}", murmur2(s.as_bytes(), 123));
    
    // 数值
    let numbers = [42u32, 100u32, 255u32];
    for &num in &numbers {
        println!("Number {} hash: {}", num, murmur2(&num.to_le_bytes(), 0));
    }

    // 4. 在HashMap中使用自定义哈希
    println!("\nCustom HashMap example:");
    let mut custom_map = HashMap::new();
    
    #[derive(Hash)]
    struct CustomKey {
        id: u32,
        category: String,
    }
    
    impl CustomKey {
        fn hash(&self) -> u32 {
            let id_hash = murmur2(&self.id.to_le_bytes(), 0);
            let cat_hash = murmur2(self.category.as_bytes(), 0);
            id_hash.wrapping_add(cat_hash)
        }
    }
    
    let key1 = CustomKey {
        id: 1,
        category: "admin".to_string(),
    };
    
    let key2 = CustomKey {
        id: 2,
        category: "user".to_string(),
    };
    
    custom_map.insert(key1.hash(), "Admin data");
    custom_map.insert(key2.hash(), "User data");
    
    println!("Custom map contents: {:?}", custom_map);
}

性能提示

  1. 对于小数据块,MurmurHash2性能极佳
  2. 种子值可以用于创建不同的哈希序列
  3. 对于已知长度的数据,可以考虑使用更具体的函数变体

注意事项

  • MurmurHash2不是加密安全的哈希算法
  • 不同平台或版本可能会产生不同的哈希结果
  • 对于哈希表等用途,建议测试实际碰撞率

murmur2库是处理非加密哈希需求的轻量级解决方案,特别适合需要快速哈希计算的场景如哈希表、布隆过滤器等。

回到顶部