5 个稳定版本
1.0.10 | 2024 年 7 月 25 日 |
---|---|
1.0.9 | 2024 年 5 月 31 日 |
1.0.8 | 2023 年 6 月 26 日 |
1.0.7 | 2023 年 2 月 24 日 |
1.0.3 |
|
281 在 算法 中
150 每月下载量
80KB
960 行
Rust 对来自英特尔论文 "通过英特尔研究和开发构建高性能、基于软件的 CRC 生成器的方法" 的 Slice-by-8 算法的改进实现
slice-by-8 不加载标准库(即 #![no_std]
)
状态
目录
简介
slice-by-8 包提供使用英特尔 Slice-by-8 算法的改进变体执行 CRC 哈希的函数。如果需要使用自己的,该包提供了使用查找表作为参数的 slice-by-8 算法。该包还提供了在 slice_by_8::crc32
中的 CRC32(多项式 0x04c11db7
)和在 slice_by_8::crc32c
中的 CRC32c(多项式 0x1EDC6F41
)。如果启用,CRC32c 哈希可以使用 CRC32c 内置函数。您可以通过在 x86_64
target_arch 上启用 sse4.2
target_feature 或在 aarch64
target_arch 上启用 crc
target_feature 来启用内嵌版本。
使用方法
使用 Hasher
use hud_slice_by_8::crc32::CRC32BuildHasher;
use std::collections::HashMap;
const KEY: &str = "hash";
const VALUE: &str = "me!";
// Create a HashMap that use CRC32Hasher to hash keys
let mut map = HashMap::with_hasher(CRC32BuildHasher::default());
map.insert(KEY, VALUE);
assert_eq!(map.get(&KEY), Some(&VALUE));
使用 slice-by-8 函数
slice-by-8 提供对字节数组切片进行哈希的函数。
use hud_slice_by_8::crc32c;
const HASH_ME: &[u8] = b"abcdefghijklmnopqrstuvwxyz";
assert_eq!(crc32c::slice_by_8(HASH_ME), 0x9EE6EF25);
注意: slice_by_8
与 slice_by_8_with_seed
类似,其中 seed
等于 0
。
使用您自己的查找表
您自己的查找表必须是 [[u32; 256]; 8]
。
use hud_slice_by_8::slice_by_8;
let my_lookup_table: [[u32; 256]; 8] = hud_slice_by_8::generate_table(hud_slice_by_8::crc32::POLYNOMIAL);
const HASH_ME: &[u8] = b"abcdefghijklmnopqrstuvwxyz";
assert_eq!(slice_by_8(HASH_ME, &my_lookup_table), 0x4C2750BD);
生成查找表
该包提供 generate_table
函数,可以从多项式生成查找表。
use hud_slice_by_8::generate_table;
use hud_slice_by_8::{crc32, crc32c};
assert_eq!(generate_table(crc32::POLYNOMIAL), crc32::LOOKUP_TABLE);
assert_eq!(generate_table(crc32c::POLYNOMIAL), crc32c::LOOKUP_TABLE);
性能
改进基于
无运行时依赖
~185KB