#string-interning #string #interning #symbol #intern #str

arc-string-interner

一种高效的并发字符串池数据结构,具有最小的内存占用和快速访问底层内容的能力。

3 个不稳定版本

0.3.0-alpha22021年11月8日
0.3.0-alpha12021年10月11日
0.1.1 2021年6月16日
0.1.0 2020年4月1日

1304数据结构

每月31 次下载

MIT/Apache

50KB
803

字符串池

Linux Windows Codecov Coveralls 文档 Crates.io
travisCI appveyor codecov coveralls docs crates

一个高效缓存字符串的数据结构,具有最小的内存占用和将池化字符串与唯一符号关联的能力。这些符号允许对底层池化字符串内容进行常数时间比较和查找。此外,遍历池化字符串也是缓存高效的。

内部结构

  • 内部使用一个哈希表 M 和一个向量 V
  • V 存储池化字符串的内容,而 M 则包含对 V 中字符串的内部引用,以避免重复。
  • V 通过间接引用存储字符串,以避免迭代器失效。
  • 返回的符号通常具有较低的内存占用,并且可以高效比较。

计划中的功能

  • 安全的抽象包装器,可保护用户免受以下误用的侵害
    • 使用不同字符串池实例的符号来解决另一个字符串。
    • 使用已经不再有效的符号(即关联的字符串池不再可用)。

许可证

根据您的选择许可

双许可: badge badge

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,都将如上双重授权,没有任何附加条款或条件。

变更日志

  • 0.7.1

    • CRITICAL 修复了在 StringInterner::clone() 中的使用后释放的漏洞
    • StringInterner 实现了 std::iter::Extend
    • Sym::from_usize 现在避免了使用 unsafe 代码
    • 优化了 StringInternerFromIterator 实现
    • 迁移到 Rust 2018 版本

    感谢 YOSHIOKA Takuma 实现了这个版本。

  • 0.7.0

    • 将许可证从 MIT 更改为 MIT/APACHE2.0
    • 删除了类型 Symbol 的泛型实现,这些类型是 From<usize>Into<usize>
    • 由于使用该API会破坏不变性,因此删除了 StringInterner::clear API
    • 添加了 StringInterner::{capacity, reserve} API
    • 引入了一个新的默认符号类型 Sym,它是对 NonZeroU32 的薄包装(灵感来自 koute
    • DefaultStringInterner 定义为新 StringInterner<Sym>
    • StringInterner<S: Sym>

      添加了方便的 FromIterator 实现
    • dev
      • 重写了所有单元测试(serde 测试仍然缺失)
      • 完全重构了基准测试框架
      • html_root_url 添加到 crate 根目录

    感谢 matklad 提供建议和推动

  • 0.6.3

    • 修复了一个错误,该错误使 StringInternerSend 实现没有遵守其泛型 HashBuilder 参数。修复了 GitHub 问题 #4
  • 0.6.2

    • StringInterner 添加了公共方法 shrink_to_fit -(由 artemshein 提供)
  • 0.6.1

    • 修复了一个错误,该错误由于悬垂指针导致插入非拥有字符串类型(例如 str)而损坏(感谢 artemshein 修复它!)
  • 0.6.0

    • 添加了可选的 serde 序列化和反序列化支持
    • StringInterner 添加了更高效和泛型的 PartialEq 实现
    • 使 StringInterner 泛型化 BuildHasher 以允许使用自定义哈希器
  • 0.5.0

    • StringInterner 添加了 IntoIterator 特征实现
    • 大大简化了迭代器代码
  • 0.4.0

    • 删除了 SymbolUnsigned 限制
  • 0.3.3

    • SendSync 添加到 InternalStrRef 中,以使 StringInterner 本身 SendSync

依赖项

~0.5–1MB
~17K SLoC