#hash #string #hash-map #hasher #gamedev

nightly sys no-std cityhash-sys

Google CityHash 算法的 Rust 绑定

4 个稳定版本

1.0.6 2024 年 7 月 25 日
1.0.5 2023 年 2 月 23 日
1.0.2 2022 年 7 月 4 日
0.5.0 2022 年 5 月 5 日

995算法

Download history 2/week @ 2024-04-22 41/week @ 2024-07-01 131/week @ 2024-07-22 40/week @ 2024-07-29

每月 171 次下载

MIT 许可证

55KB
924

CityHash

Crates.io License

Rust 到 Google CityHash 的 C++ API 的绑定。CityHash-sys 不加载标准库(即 no_std)。

状态

Build Clippy docs.rs Test codecov

目录

  1. 简介
  2. 使用方法
    1. 使用 Hasher
    2. 使用可移植的 CityHash 函数
    3. 使用带 CRC-32 内置函数的 CityHash 函数
  3. 性能
  4. 更多信息

简介

CityHash 为字符串提供哈希函数。这些函数彻底混合输入位,但不适合加密。CityHash-sys 在小端架构上进行了测试,但应在大端架构上也能工作。

使用方法

使用 Hasher

use cityhash_sys::CityHashBuildHasher;
use std::collections::HashMap;
const KEY: &str = "hash";
const VALUE: &str = "me!";

// Create a HashMap that use CityHash64 to hash keys
let mut map = HashMap::with_hasher(CityHashBuildHasher::default());
map.insert(KEY, VALUE);

assert_eq!(map.get(&KEY), Some(&VALUE));

注意 CityHashBuildHasher 是 64 位 CityHash CityHash64Hasher 的别名。CityHash32HasherCityHash128Hasher 也可用,但结果仍然是 u64。有关更多详细信息,请参阅文档。

使用可移植的 CityHash 函数

Rust 绑定提供了对所有不使用 x86_64 CRC 内置函数的 Google CityHash 哈希函数的安全接口

32 位哈希

// uint32 CityHash32(const char *, size_t);
fn city_hash_32(buf: &[u8]) -> u32;

64 位哈希

// uint64 CityHash64(const char *, size_t);
fn city_hash_64(buf: &[u8]) -> u64;

// uint64 CityHash64WithSeed(const char *, size_t, uint64);
fn city_hash_64_with_seed(buf: &[u8], seed: u64) -> u64; 

// uint64 CityHash64WithSeeds(const char *, size_t, uint64, uint64);
fn city_hash_64_with_seeds(buf: &[u8], seed_0: u64, seed_1: u64) -> u64;

128 位哈希

// uint128 CityHash128(const char *, size_t);
fn city_hash_128(buf: &[u8]) -> u128;

// uint128 CityHash128WithSeed(const char *, size_t, uint128);
fn city_hash_128_with_seed(buf: &[u8], seed: u128) -> u128;

// uint64 Hash128to64(const uint128&);
fn city_hash_128_to_64(hash: u128) -> u64;

注意: 根据您的编译器和硬件,在足够长的字符串上可能比 CityHash64() 更快。对于较短的字符串,它比必要的要慢。

使用带 CRC-32 内置函数的 CityHash 函数

某些函数仅在目标为 x86_64 且至少支持 sse4.2 目标特性时才可用,因为这些函数使用了 CRC-32 内置函数 _mm_crc32_u64 。如果我们想启用这些函数,请使用 -C target-feature=+sse4.2 或更高(avxavx2)。请注意,根据要哈希的缓冲区长度,使用非内置版本可能更快。如果要哈希的缓冲区小于 900 字节,CityHashCrc128WithSeedCityHashCrc128 分别内部调用 CityHash128WithSeedCityHash128,在这种情况下,直接调用 CityHash128WithSeedCityHash128 更好。

带 CRC-32 内置函数的 128 位哈希

// uint128 CityHashCrc128(const char *, size_t);
unsafe fn city_hash_crc_128(buf: &[u8]) -> u128;

// uint128 CityHashCrc128WithSeed(const char *, size_t, uint128);
unsafe fn city_hash_crc_128_with_seed(buf: &[u8], seed: u128) -> u128;

256位CRC-32内嵌哈希

// void CityHashCrc256(const char *, size_t, uint64 *);
unsafe fn city_hash_crc_256(buf: &[u8]) -> [u64; 4];

性能

在64位硬件上,CityHash适用于短字符串哈希,例如大多数哈希表键,特别是比city_hash_128更快的city_hash_64。在32位硬件上,CityHash是x86上Murmur3的近似的竞争对手。

更多信息

请参阅Google Cityhash README

无运行时依赖

~185KB