1 个不稳定版本

0.1.0 2024年7月1日

#15 in #equality

MPL-2.0 许可证

11KB
122 行代码(不包括注释)

字符串池。

字符串池是一种在编译器和其他需要以低成本存储和比较许多重复字符串的环境中常用的数据结构。"池化"一个字符串会返回一个 ID(或者在很多实现中是一个指针),这个 ID 可以低成本地复制和执行相等性检查。这是通过使用内部哈希表来去重字符串实现的。

此字符串池还利用 bumpalo 在单个增量分配缓冲区中存储所有字符串,从而避免了过度分配。

我决定用 32 位 ID 而不是引用来表示池化字符串,以避免引入生命周期。这确实意味着访问底层字符串需要调用池化器上的方法,但这只是一个简单的数组查找。

示例

use bayou_interner::Interner;

let interner = Interner::new();

let hello = interner.intern("hello");
let hello2 = interner.intern("hello");
let world = interner.intern("world");

// Interned strings can be compared cheaply.
assert_ne!(hello, hello2);
assert_ne!(hello, world);

// Getting the associated string for an interned string.
assert_eq!(interner.get_str(hello), Some("hello"));

依赖项

~1.5–2MB
~29K SLoC