#string-representation #string #inline #reference-counting #cow #byte-slice

no-std hipstr

另一个 Rust 字符串:零成本的借用和切片,小字符串的内联表示,(原子)引用计数

9 个不稳定版本 (4 个破坏性更新)

0.5.1 2024 年 8 月 2 日
0.5.0 2024 年 6 月 25 日
0.4.0 2023 年 12 月 1 日
0.3.3 2023 年 10 月 30 日
0.1.0 2023 年 6 月 1 日

#54内存管理

Download history 1/week @ 2024-04-28 9/week @ 2024-05-19 8/week @ 2024-05-26 13/week @ 2024-06-02 4/week @ 2024-06-09 1/week @ 2024-06-16 131/week @ 2024-06-23 14/week @ 2024-06-30 23/week @ 2024-07-07 99/week @ 2024-07-28 13/week @ 2024-08-04 2/week @ 2024-08-11

每月 114 次下载

MIT/Apache

400KB
9K SLoC

hipstr

Rust Clippy & Miri codecov Docs MIT OR Apache-2.0

另一个 Rust 字符串类型 🦀

  • 通过 borrowed (一个 const 构造函数) 或 from_static 进行无拷贝 借用
  • 无拷贝 小字符串 (64 位平台上的 23 字节)
  • 无拷贝 拥有切片
  • 一个利基:`Option<HipStr>` 和 `HipStr` 具有相同的大小
  • 零依赖 且与 `no_std` 兼容的 `alloc`

还有字节字符串、操作系统字符串和路径!

⚡ 示例

use hipstr::HipStr;

let simple_greetings = HipStr::from_static("Hello world");
let _clone = simple_greetings.clone(); // no copy

let user = "John";
let greetings = HipStr::from(format!("Hello {}", user));
let user = greetings.slice(6..): // no copy
drop(greetings); // the slice is owned, it exists even if greetings disappear

let chars = user.chars().count(); // "inherits" `&str` methods

✏️ 功能

  • std (默认): 使用 std 而不是 corealloc,并提供了更多的 trait 实现(用于比较、转换和错误)
  • serde: 提供 serde crate 的序列化/反序列化支持
  • unstable: 暴露可能随时更改的内部 Backend trait

☣️ `hipstr` 的安全性

此 crate 广泛使用 unsafe。🤷

它利用大多数平台(我想是所有 Rustc 支持的平台)上存在的指针 2 位对齐利基,来区分内联表示和其他表示。

为了提高安全性,Rust 在多个平台上进行了彻底测试,通常与 Miri(MIR 解释器)一起。

🧪 测试

☔ 覆盖率

此 crate 具有近乎完整的行覆盖率

cargo llvm-cov --all-features --html
# or
cargo tarpaulin --all-features --out html --engine llvm

Codecov 上查看当前的覆盖率

Coverage grid

🖥️ 跨平台测试

您可以使用 cross 在各种平台上轻松运行测试

cross test --target s390x-unknown-linux-gnu         # 32-bit BE
cross test --target powerpc64-unknown-linux-gnu     # 64-bit BE
cross test --target i686-unknown-linux-gnu          # 32-bit LE
cross test --target x86_64-unknown-linux-gnu        # 64-bit LE

注意:之前我使用MIPS目标的大端模式,但由于一些LLVM相关的问题,它们现在不再工作……请参阅 Rust问题#113065

🔍 Miri

该软件包在Miri上运行成功

MIRIFLAGS=-Zmiri-symbolic-alignment-check cargo +nightly miri test

for SEED in $(seq 0 10); do
  echo "Trying seed: $SEED"
  MIRIFLAGS="-Zmiri-seed=$SEED" cargo +nightly miri test || { echo "Failing seed: $SEED"; break; };
done

以检查不同的字长和字节序

# Big endian, 64-bit
cargo +nightly miri test --target mips64-unknown-linux-gnuabi64
# Little endian, 32-bit
cargo +nightly miri test --target i686-unknown-linux-gnu

📦 类似软件包

#[non_exhaustive]

名称 线程安全且经济的克隆 本地经济克隆 内联 经济切片 字节 Cow<'a> 注释
hipstr 🟢 🟢 🟢 🟢 🟢 🟢 显然!
arcstr 🟢* ❌** *使用自定义的瘦Arc,**重量级切片(具有专用子字符串类型)
flexstr 🟢* 🟢 🟢 *使用一个Arc<str>而不是一个Arc<String>(减少了一层间接引用但使用了胖指针)
imstr 🟢 🟢 🟢
faststr 🟢 🟢 🟢 零文档且API复杂
fast-str 🟢 🟢 🟢 内联表示是可选的
ecow 🟢* 🟢 🟢** *只有两个单词🤤,**甚至任何T
cowstr 🟢 ❌* ❌** *重量级切片,**与它的名称相反
compact_str 🟢 🟢* *通过smallvec启用
inline_string 🟢
smartstring 🟢
smallstr 🟢
smol_str 🟢* *但只有内联字符串,这里仅供参考

跳过类似于tinystr(仅ASCII,有界)或bstr、或bytestring等专用字符串类型

简而言之,HipStr,一种字符串类型统治一切 😉

How standards proliferate

🏎️ 性能

虽然速度不是hipstr的主要动机,但它似乎在这方面做得不错。

在我的i7-8550U上,在Arch Linux上(在Windows 11/WSL 2上),从切片创建HipStr与其他软件包和std具有竞争力

string-comparison/chart.svg

📖 作者和许可证

目前,只是我PoLazarus 👻
欢迎帮助! 🚨

MIT + Apache

依赖项

~0–305KB