#string-interning #interning #byte-buffer #symbols

interner

无依赖项的字符串、路径和缓冲区重入仓库

4 个版本

0.2.1 2023 年 6 月 25 日
0.2.0 2023 年 6 月 2 日
0.1.1 2023 年 2 月 8 日
0.1.0 2023 年 2 月 7 日

编码类别下排名 293

Download history 282/week @ 2024-03-13 232/week @ 2024-03-20 218/week @ 2024-03-27 231/week @ 2024-04-03 119/week @ 2024-04-10 253/week @ 2024-04-17 375/week @ 2024-04-24 272/week @ 2024-05-01 418/week @ 2024-05-08 3272/week @ 2024-05-15 1352/week @ 2024-05-22 842/week @ 2024-05-29 842/week @ 2024-06-05 468/week @ 2024-06-12 552/week @ 2024-06-19 252/week @ 2024-06-26

每月下载量 2,251
用于 4 仓库(3 个直接使用)

MIT/Apache 协议

51KB
1K SLoC

interner

interner forbids unsafe code crate version Live Build Status HTML Coverage Report for main branch Documentation

一个无依赖项且无 unsafe 代码的 Rust 重入仓库(#![forbid(unsafe_code)])。大多数现有的重入仓库只提供字符串的重入。这个仓库允许重入路径和字节数据。

此仓库的工作原理

此仓库使用 HashSetVec 来存储其条目。当查找值时,如果无法在 HashSet 中找到,它将在 Vec 中分配一个槽位。未来的查找将返回一个 Arc 包装数据的克隆。

Pooled<T> 值的最后一个引用被丢弃时,池的 HashMap 中的值将被移除,且 Vec 的槽位将可用于重新使用。

此仓库不执行子值重入。每个值都是独立存储的,具有自己的分配。

池值哈希

Pooled<T> 类型通过哈希其内部唯一 ID 而不是使用 T::hash() 来实现 Hash。这使得池化对象可以用作哈希表和集合中高效的关键字。

因为 T::hash()Pooled<T>::hash() 不同,Pooled<T> 没有实现 Borrow<T>。这阻止了使用一个 &strHashMap 中查找值。

Pooled<T> 值用作基于哈希的集合中的键的另一个重要注意事项是,所有 Pooled<T> 值必须来自同一个池。使用来自不同池的值将导致在大多数情况下查找无法找到包含的键。当使用此不受支持的流程时,永远不会发生不正确的匹配,因为 Pooled<T>::eq() 被实现来验证值来自同一个池,否则将比较底层值。

全局内部字符串

use interner::global::{GlobalString, GlobalPool};

static STRINGS: GlobalPool<String> = GlobalPool::new();

let my_string = STRINGS.get("hello");
let other_copy = STRINGS.get(String::from("hello"));

// Both `my_string` and `other_copy` are pointing to the same underlying string.
assert!(GlobalString::ptr_eq(&my_string, &other_copy));

来自 StringPool 的内部字符串

use interner::shared::{StringPool, SharedString};

let pool = StringPool::default();
let my_string = pool.get("hello");
let other_copy = pool.get(String::from("hello"));

// Both `my_string` and `other_copy` are pointing to the same underlying string.
assert!(SharedString::ptr_eq(&my_string, &other_copy));

全局内部路径

use std::path::{Path, PathBuf};
use interner::global::{GlobalPath, GlobalPool};

static PATHS: GlobalPool<PathBuf> = GlobalPool::new();

let my_path = PATHS.get(Path::new("hello"));
let other_copy = PATHS.get(PathBuf::from("hello"));

// Both `my_path` and `other_copy` are pointing to the same underlying path.
assert!(GlobalPath::ptr_eq(&my_path, &other_copy));

来自 PathPool 的内部路径

use std::path::{Path, PathBuf};
use interner::shared::{PathPool, SharedPath};

let pool = PathPool::default();
let my_string = pool.get(Path::new("hello"));
let other_copy = pool.get(PathBuf::from("hello"));

// Both `my_path` and `other_copy` are pointing to the same underlying path.
assert!(SharedPath::ptr_eq(&my_string, &other_copy));

全局内部字节数组

use interner::global::{GlobalBuffer, GlobalPool};

static BUFFERS: GlobalPool<Vec<u8>> = GlobalPool::new();

let my_buffer = BUFFERS.get(&b"hello"[..]);
let other_copy = BUFFERS.get(b"hello".to_vec());

// Both `my_buffer` and `other_copy` are pointing to the same underlying path.
assert!(GlobalBuffer::ptr_eq(&my_buffer, &other_copy));

来自 BufferPool 的内部字节数组

use interner::shared::{BufferPool, SharedBuffer};

let pool = BufferPool::default();
let my_buffer = pool.get(&b"hello"[..]);
let other_copy = pool.get(b"hello".to_vec());

// Both `my_path` and `other_copy` are pointing to the same underlying path.
assert!(SharedBuffer::ptr_eq(&my_buffer, &other_copy));

开源许可

该项目,如同 Khonsu Labs 的所有项目一样,是开源的。此存储库可在 MIT 许可证Apache 许可证 2.0 下使用。

要了解更多关于贡献的信息,请参阅 CONTRIBUTING.md

无运行时依赖