hashcons 0.1.2

Hash cons'ing for compact representations of shared, immutable data structures
Documentation

Hash Cons'ing for Rust
======================

Sometimes, an `Rc<T>` is insufficient for efficient, compact immmutable structures.

By contrast:

- A `Merkle<T>` gives a _compact serialization_ in the presence of sharing.

- A `Hc<T>` gives a _unique representation_ in the presence of sharing.

Status
---------

- The type `Merkle<_>` is implemented and tested.
- The type `Hc<_>` is a minor variation; it remains as future work.

Background
-----------

Sometimes, we want a shared instance of some type `T` that serializes
*once*, not _once per reference_, as is the case with the `Rc` type.

Unlike a "bare" `Rc<T>`, a `Merkle<T>` enjoys the practical property
that, when a structure holding multiple (shared) instances of `Merkle<T>` is
serialized, this serialized output holds only _one_ occurrence of
each `T`'s serialized representation; the other occurrences merely
consist of the `T`'s unique identifier (the serialization of an
`Id`, single machine word on modern machines).

Implementation summary
-----------------------

A `Merkle<T>` has a unique ID (computed as a hash) that permits table-based indirection,
via temporary storage used by serialization and serialization logic.

By contrast, a bare `Rc<T>` lacks this indirection, and thus, it lacks
a compact serialized representation for structures with abundant
sharing. Generally, abundant sharing via many shared `Rc<_>`s leads to
*exponential blow up* in terms of serialized space and time.