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

已下架 slice-by-8

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

4个稳定版本

1.0.6 2023年2月24日
1.0.5 2023年2月23日
1.0.4 2022年9月20日
1.0.2 2022年6月24日
0.1.0 2022年5月5日

#hasher 中排名 75

每月下载 28

MIT 许可证

78KB
961

按8分割

Crates.io License

警告: 此软件包不再维护,请使用 hud-slice-by-8 代替

--- Rust对来自论文 "*英特尔研究人员与开发人员的系统方法构建高性能、基于软件的CRC生成器*" 的[Slice-by-8](http://slicing-by-8.sourceforge.net/)英特尔算法的改进实现

按8分割不加载标准库(即 #![no_std]

状态

Build Clippy docs.rs Test codecov

目录

  1. 介绍
  2. 使用方法
    1. 使用哈希器
    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内联函数。您可以通过启用 sse4.2 目标功能在 x86_64 target_arch上启用内联版本,或者在 aarch64 target_arch上通过启用 crc 目标功能。

使用方法

使用哈希器

use 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 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 slice_by_8::slice_by_8;

let my_lookup_table: [[u32; 256]; 8] = slice_by_8::generate_table(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 slice_by_8::generate_table;
use slice_by_8::{crc32, crc32c};

assert_eq!(generate_table(crc32::POLYNOMIAL), crc32::LOOKUP_TABLE);
assert_eq!(generate_table(crc32c::POLYNOMIAL), crc32c::LOOKUP_TABLE);

性能

改进基于

无运行时依赖

~180KB