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

无 std hud-slice-by-8

HUD 软件的 Rust 对 Intel Slice-By-8 算法的改进实现

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 2022 年 9 月 20 日

281算法

Download history 140/week @ 2024-05-31 6/week @ 2024-06-07 3/week @ 2024-06-14 84/week @ 2024-07-19 62/week @ 2024-07-26 4/week @ 2024-08-02

150 每月下载量

MIT 许可证

80KB
960

slice-by-8

Crates.io License

Rust 对来自英特尔论文 "通过英特尔研究和开发构建高性能、基于软件的 CRC 生成器的方法" 的 Slice-by-8 算法的改进实现

slice-by-8 不加载标准库(即 #![no_std]

状态

Build Clippy docs.rs Test codecov

目录

  1. 简介
  2. 使用方法
    1. 使用 Hasher
    2. 使用 slice-by-8 函数
    3. 使用您自己的查找表
  3. 生成查找表
  4. 性能

简介

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_8slice_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