hashmark 0.1.0

Merkle tree hashing for efficient change detection
Documentation
# hashmark

Merkle tree hashing for efficient change detection in Rust.

## Overview

hashmark builds Merkle trees from your data structures using serde, enabling:

- Fast change detection via hash comparison
- Field-level diff paths (e.g., `address.city`)
- Field reference access via bevy_reflect
- Serializable trees for distributed sync

## Quick Start

```rust
use serde::Serialize;
use hashmark::{tree_hash, merkle_diff, Diff};

#[derive(Serialize)]
struct User {
    name: String,
    age: u32,
}

let old = User { name: "Alice".into(), age: 30 };
let new = User { name: "Alice".into(), age: 31 };

let m1 = tree_hash(&old).unwrap();
let m2 = tree_hash(&new).unwrap();

match merkle_diff(&m1, &m2) {
    Diff::Same => println!("No changes"),
    Diff::Different(detail) => {
        for (path, change) in detail.changed_paths() {
            println!("{}: {:?}", path, change);
        }
    }
}
```

## Remote Sync

Send Merkle trees between peers for efficient distributed sync:

```rust
use serde::{Serialize, Deserialize};
use bevy_reflect::Reflect;
use hashmark::{tree_hash, Merkle};

#[derive(Serialize, Deserialize, Reflect)]
struct Config {
    port: u16,
    debug: bool,
}

// Peer A: send merkle tree (not the data)
let config = Config { port: 8080, debug: true };
let merkle = tree_hash(&config).unwrap();
let json = serde_json::to_string(&merkle).unwrap();

// Peer B: receive and compare against local data
let received: Merkle = serde_json::from_str(&json).unwrap();
let local = Config { port: 9000, debug: true };

let changes = received.diff_with_data_reflect(&local).unwrap();
for change in &changes {
    println!("{}: {:?}", change.path, change.change_type);
    // change.local: Option<&dyn PartialReflect>
}
```

## License

MIT