axhash 0.11.0

Simple Rust entrypoint for the AxHash engine.
Documentation
# Benchmarks — AxHash v0.11.0

Benchmarks were conducted on Apple Silicon M4, using the `release` profile. Results include:

- **Criterion.rs** for internal micro-benchmarks (per API, per payload).
- **SMHasher3** (fwojcik fork) for statistical distribution & collision validation.

## Industrial-Grade Validation

| Item | Value |
|------|------|
| SMHasher3 full suite | **`pass` — 188 / 188** |
| Verification value (LE) | `0xB6E1DBEA` |
| Backend runtime | `aarch64_aes_neon` (Apple M4) |
| Hash bits | 64 |
| Total suite duration | ~240 seconds |

Reproduction:
```bash
cargo build --release -p axhash-ffi
# Link libaxhash_ffi.a to your SMHasher3 build, then:
./SMHasher3 AxHash-64
```

## Head-to-Head vs Popular Hashers

Apple M4, single-thread, median of 300 samples × 200 batches.

### Throughput (GB/s, higher = better)

| Hasher        | 4 B  | 16 B  | 64 B  | 256 B | 4 KB  | 64 KB |
|---------------|-----:|------:|------:|------:|------:|------:|
| **axhash**    | 3.20 | 10.96 | 21.96 | **34.13** | **~100** | **~98** |
| xxh3          | 3.20 | 12.80 | 25.60 | 27.31 | 45.83 | 44.15 |
| wyhash        | 1.92 | 6.40  | 23.62 | 30.71 | 26.60 | 25.39 |
| ahash         | 2.13 | 10.96 | 23.62 | 27.93 | 21.68 | 20.83 |
| fxhash        | 3.20 | 12.80 | 27.95 | 36.13 | 25.24 | 24.08 |
| siphash-1-3   | 1.13 | 3.07  | 5.39  | 5.77  | 5.73  | 5.78  |
| highwayhash   | 0.23 | 0.96  | 3.10  | 7.31  | 10.46 | 10.86 |

axhash **leads bulk throughput ≥ 4 KB** thanks to the AES-NEON pipeline. For payloads ≥4 KB, axhash is **2× faster than xxh3**.

### Tiny-Key Latency (ns/op, lower = better)

| Hasher       | 1 B  | 4 B  | 8 B  | 16 B | 32 B | 64 B |
|--------------|-----:|-----:|-----:|-----:|-----:|-----:|
| **axhash**   | 1.67 | **1.25** | **1.25** | **1.25** | 1.67–1.88 | 2.50–2.71 |
| xxh3         | 1.46 | 1.25 | 1.25 | 1.25 | 1.88 | 2.50–2.71 |
| wyhash       | 2.08 | 2.08 | 2.29 | 2.50 | 2.08 | 2.71 |
| ahash        | 1.88 | 1.88 | 1.88 | 1.67 | 1.88 | 2.71 |
| fxhash       | 1.46 | 1.25 | 1.25 | 1.25 | 1.46 | 2.29–2.92 |
| siphash-1-3  | 3.54 | 3.54 | 4.17 | 5.21 | 7.29 | 12.08 |
| highwayhash  | 17.29| 17.50| 16.66| 16.66| 17.50| 20.62 |

axhash is **tied with xxh3 & fxhash** for 4–16 byte keys (the most common workload for HashMaps with u32/u64/short-string keys).

### Streaming 4 KiB via Chunked Writes (ns total per hash, lower = better)

| Hasher       | 8 B  | 32 B | 64 B  | 256 B | 1 KB  | 4 KB  |
|--------------|-----:|-----:|------:|------:|------:|------:|
| **axhash**   | 654  | 228  | 179   | 198   | **68**  | **42** |
| xxh3         | 1717 | 614  | 291   | 150   | 124   | 124   |
| wyhash       | 1377 | 373  | 263   | 180   | 156   | 154   |
| ahash        | 880  | 306  | 244   | 199   | 188   | 188   |
| fxhash       | 505  | 138  | 138   | 115   | 134   | 162   |
| siphash-1-3  | 1495 | 916  | 818   | 741   | 721   | 727   |
| highwayhash  | 1721 | 769  | 576   | 418   | 387   | 388   |

axhash is **3× faster than xxh3 for 1 KB & 4 KB chunked-write** (AES-NEON pipeline is highly amortized at high throughput).

### Concurrent Scaling (ops/sec, 256 B payload)

| Hasher       | 1 thread | 2 threads | 4 threads | 8 threads |
|--------------|---------:|----------:|----------:|----------:|
| **axhash**   | **1.25 e8** | **2.48 e8** | 4.81 e8 | 5.68 e8 |
| xxh3         | 1.02 e8  | 1.99 e8   | 3.06 e8   | 3.87 e8   |
| wyhash       | 1.16 e8  | 2.19 e8   | 4.69 e8   | 6.35 e8   |
| ahash        | 1.05 e8  | 2.06 e8   | 4.23 e8   | 5.76 e8   |
| fxhash       | 1.33 e8  | 2.59 e8   | 5.28 e8   | 7.55 e8   |
| siphash-1-3  | 2.24 e7  | 4.39 e7   | 8.72 e7   | 1.12 e8   |
| highwayhash  | 2.84 e7  | 5.55 e7   | 1.10 e8   | 1.48 e8   |

axhash is **#1 for 1–2 threads**, and remains competitive at 4–8 threads (fxhash leads due to its minimal state).

### Hash Quality (sampling, all hashers ideal)

| Hasher       | avalanche % | collision % | chi² (256 buckets) | max bit-bias % |
|--------------|------------:|------------:|-------------------:|---------------:|
| axhash       | 49.84       | 0.000000    | 278.0              | 0.4088         |
| xxh3         | 49.83       | 0.000000    | 275.2              | 0.3612         |
| wyhash       | 49.92       | 0.000000    | 289.3              | 0.3372         |
| ahash        | 50.20       | 0.000000    | 295.9              | 0.3472         |
| fxhash       | 50.02       | 0.000000    | 267.6              | 0.2944         |
| siphash-1-3  | 49.90       | 0.000000    | 248.7              | 0.4088         |
| highwayhash  | 50.15       | 0.000000    | 256.3              | 0.3572         |

axhash quality is **in the ideal range** (avalanche ≈ 50%, 0 collisions in 1M random inputs). Bit-bias of 0.41% is comparable to siphash-1-3 and ahash.

### HashMap Workload (10,000 entries, ns/op)

`get-hit`:

| Hasher       |  min |  median |  mean | ±stddev |
|--------------|-----:|--------:|------:|--------:|
| **axhash**   | 1.21 | **1.22**| 1.25  | 0.11    |
| xxh3         | 7.92 | 8.05    | 8.47  | 1.82    |
| wyhash       | 1.44 | 1.48    | 1.53  | 0.16    |
| ahash        | 1.57 | 1.61    | 1.61  | 0.03    |
| fxhash       | 1.18 | 1.34    | 1.31  | 0.07    |
| siphash-1-3  | 4.29 | 5.12    | 6.84  | 3.36    |
| highwayhash  | 33.00| 35.53   | 37.98 | 6.58    |

axhash is **#1 in HashMap get-hit median** (1.22 ns), outperforming fxhash (1.34) and xxh3 (8.05).

`mixed` (70% get-hit, 20% miss, 10% insert):

| Hasher       |  min | median |  mean | ±stddev |
|--------------|-----:|-------:|------:|--------:|
| **axhash**   | 6.84 | **7.08** | 7.28 | 0.58   |
| xxh3         | 15.87| 16.40  | 16.51 | 0.44    |
| wyhash       | 7.53 | 7.90   | 8.13  | 0.65    |
| ahash        | 9.31 | 9.62   | 9.60  | 0.16    |
| fxhash       | 6.64 | 7.28   | 7.48  | 0.74    |
| siphash-1-3  | 14.06| 14.15  | 14.21 | 0.21    |
| highwayhash  | 47.68| 48.72  | 48.73 | 0.66    |

axhash is **a strong #2** in HashMap mixed workload (just behind fxhash, far ahead of xxh3).

## Single-Hasher Criterion Detail

### `Hash` Trait Integration

| Operation                        | Latency |
|----------------------------------|--------:|
| `axhash_of::<u64>()`             | ~358 ps |
| `axhash_of::<u32>()`             | ~430 ps |
| `axhash_of::<&str>()` (8 char)   | ~1.13 ns |
| `axhash_of::<struct>()`          | ~1.00 ns |
| `write_u64` + `finish`           | ~358 ps |
| `write_u32` + `finish`           | ~430 ps |
| `HashMap` builder creation       | ~1.44 ns |

### `HashMap` (AxBuildHasher vs `DefaultHasher`)

`insert-u64`:

| Size    | AxBuildHasher | DefaultHasher | speedup |
|---------|--------------:|--------------:|--------:|
| 100     | 1.25 µs       | 2.19 µs       | 1.75 × |
| 1 000   | 14.41 µs      | 31.08 µs      | 2.16 × |
| 10 000  | 120.5 µs      | 280.1 µs      | 2.32 × |
| 100 000 | 1.109 ms      | 2.462 ms      | 2.22 × |

`get-hit`:

| Size    | AxBuildHasher | DefaultHasher | speedup |
|---------|--------------:|--------------:|--------:|
| 100     | 196 ns        | 439 ns        | 2.24 × |
| 1 000   | 1.73 µs       | 4.61 µs       | 2.67 × |
| 10 000  | 19.20 µs      | 52.32 µs      | 2.72 × |
| 100 000 | 223.7 µs      | 599.9 µs      | 2.68 × |

`get-miss` (10,000): **14.93 µs (Ax) vs 37.55 µs (Default) — 2.51 ×**

`mixed` (random insert/get/miss): **1.037 ms (Ax) vs 1.889 ms (Default) — 1.82 ×**

## Competitive Position

| Workload | axhash Position |
|----------|---------------|
| Bulk throughput (≥4 KB) | **#1** — 2× xxh3 |
| Streaming long-chunk (≥1 KB) | **#1** — 3× xxh3 |
| HashMap get-hit median | **#1** |
| HashMap mixed median | **#2** — tied with fxhash |
| Tiny-key latency 4–16 B | **TIED** with xxh3/fxhash |
| Concurrent 1–2 thread | **#1** |
| Quality (SMHasher3) | **188/188 PASS** |

## Reproduction

```bash
# Criterion micro-benches
cargo bench

# SMHasher3 full suite (build axhash-ffi, link to SMHasher3)
cargo build --release -p axhash-ffi
~/path/to/smhasher3/build/SMHasher3 AxHash-64
```