#hashing #cache #lazy-evaluation #content

hashrevise

一个用于对数据结构进行哈希处理,然后缓存结果以避免重复工作的Rust库。

3个版本

0.1.2 2024年8月8日
0.1.1 2024年8月2日
0.1.0 2024年8月2日

#541 in 数据结构

Download history 184/week @ 2024-07-29 153/week @ 2024-08-05

每月 337 次下载

MIT 许可证

20KB
354

hashrevise

一个用于对数据结构进行哈希处理,然后缓存结果以避免重复工作的Rust库。


库的主要组件是 RevisionHash,它通过 Revisable 特性和它的 get_revision() 方法,对任意数据结构的内容进行整数摘要/摘要。通过哈希,当对象的 RevisionHash 发生变化时,我们知道其内容已发生变化,反之,如果 RevisionHash 未发生变化,则有很高的概率其内容也没有发生变化。因此,在更大的程序中,通过存储从先前的已知良好状态的数据模型的一些哈希,我们可以轻松地比较其新哈希,并准确确定是否需要从新数据执行昂贵的更新。

Revisable 特性的基本实现如下。实现应该对所有与对象身份及其表示的内容相关的字段进行哈希处理。

struct Test(i32, u8);

impl Revisable for Test {
    fn get_revision(&self) -> RevisionHash {
        let mut hasher = RevisionHasher::new();
        hasher.write_i32(self.0);
        hasher.write_u8(self.1);
        hasher.into_revision()
    }
}

当对象包含实现 Revisable 的子对象时,应鼓励递归。只需一行代码如 hasher.write_revisable(&self.subobject);

处理枚举时(您可能需要首先哈希区分符),应小心行事。在处理像 VecHashMap 这样的可变大小数据结构时也应小心,尽管已经存在一些泛型实现,可以简化这一点。

提供了一个辅助结构 Revised<T>,它看起来和像类型 T 的对象一样,但在需要时缓存该对象的 RevisionHash,而不进行可变访问。这在组合更大的数据结构时很有用,可以确保在部分修改或根本没有修改的情况下,不需要读取和哈希所有内容。理论上,这也可能用于非常大型数据结构的轻量级相等性比较。

提供了另一个辅助结构体 RevisedProperty<T>,它表示调用返回类型为 T 且所有参数都是 Revisable 的某个函数的懒计算结果。其方法 refreshN(f, arg0, arg1, ... argN) 只在参数与上一次调用 refresh 方法不同时才会在提供的参数上调用 f。这可以用来避免昂贵的计算,同时确保派生结果是最新的。调用 f 的结果可以通过 get_cached() 方法获得。

当我感到聪明且有需要时,可能会添加其他辅助工具。

依赖项

~44KB