#merkle-tree #memoization #representation #compact #shared #structures #hash

hashcons

用于共享、不可变数据结构的紧凑表示的Hash Cons'ing

2个版本

0.1.2 2020年1月21日
0.1.1 2018年7月28日

#1157数据结构

Download history 51/week @ 2024-03-30 18/week @ 2024-04-06 2/week @ 2024-04-13 40/week @ 2024-04-20 46/week @ 2024-04-27 58/week @ 2024-05-04 51/week @ 2024-05-11 92/week @ 2024-05-18 138/week @ 2024-05-25 53/week @ 2024-06-01 17/week @ 2024-06-08 96/week @ 2024-06-15 9/week @ 2024-06-22 141/week @ 2024-06-29 153/week @ 2024-07-06 81/week @ 2024-07-13

每月398次下载

MPL-2.0许可协议

15KB
239

Rust中的Hash Cons'ing

有时,一个Rc<T>对于高效、紧凑的不可变结构是不够的。

相比之下

  • Merkle<T>在存在共享的情况下提供了紧凑序列化

  • Hc<T>在存在共享的情况下提供了唯一表示

状态

  • Merkle<_>类型已实现并经过测试。
  • Hc<_>类型是微小的变化;它仍然是未来的工作。

背景

有时,我们想要一个类型T的共享实例,它只序列化一次,而不是像Rc类型那样每次引用都序列化。

与“裸”的Rc<T>不同,一个Merkle<T>具有一个实用的属性:当一个包含多个(共享)Merkle<T>实例的结构被序列化时,这个序列化输出只包含每个T序列化表示的一个实例;其他实例仅由T的唯一标识符(在现代机器上为单字节的Id序列化)组成。

实现摘要

Merkle<T>有一个唯一的ID(作为哈希计算得出)允许通过序列化和序列化逻辑使用的临时存储进行基于表的间接引用。

相比之下,裸露的 Rc<T> 缺少这种间接引用,因此,它缺少对大量共享结构的紧凑序列化表示。通常,通过许多共享的 Rc<_> 导致序列化空间和时间上的 指数级膨胀

依赖项

~0.6–1.4MB
~31K SLoC