4 个稳定版本
1.0.6 | 2024 年 7 月 25 日 |
---|---|
1.0.5 | 2023 年 2 月 23 日 |
1.0.2 | 2022 年 7 月 4 日 |
0.5.0 |
|
995 在 算法 中
每月 171 次下载
55KB
924 行
Rust 到 Google CityHash 的 C++ API 的绑定。CityHash-sys 不加载标准库(即 no_std
)。
状态
目录
简介
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
的别名。CityHash32Hasher
和 CityHash128Hasher
也可用,但结果仍然是 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
或更高(avx
或 avx2
)。请注意,根据要哈希的缓冲区长度,使用非内置版本可能更快。如果要哈希的缓冲区小于 900 字节,CityHashCrc128WithSeed
和 CityHashCrc128
分别内部调用 CityHash128WithSeed
和 CityHash128
,在这种情况下,直接调用 CityHash128WithSeed
或 CityHash128
更好。
带 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的近似的竞争对手。
更多信息
无运行时依赖
~185KB