prompt-hash 0.1.0

Deterministic cache key for an LLM prompt: normalize whitespace, hash messages, mix in model + temperature. Pairs with semantic-cache-key. Zero deps.
Documentation
use prompt_hash::key;

#[test]
fn whitespace_doesnt_change_key() {
    let a = key("claude", &[("user", "hi   ")], 1.0);
    let b = key("claude", &[("user", "hi")], 1.0);
    assert_eq!(a, b);
}

#[test]
fn temperature_change_changes_key() {
    let a = key("claude", &[("user", "x")], 0.5);
    let b = key("claude", &[("user", "x")], 0.7);
    assert_ne!(a, b);
}

#[test]
fn temperature_within_2_decimals_is_same() {
    let a = key("claude", &[("user", "x")], 0.5);
    let b = key("claude", &[("user", "x")], 0.501);
    assert_eq!(a, b);
}

#[test]
fn model_change_changes_key() {
    let a = key("claude", &[("user", "x")], 1.0);
    let b = key("gpt-5", &[("user", "x")], 1.0);
    assert_ne!(a, b);
}

#[test]
fn role_order_matters() {
    let a = key("c", &[("user", "1"), ("assistant", "2")], 1.0);
    let b = key("c", &[("assistant", "2"), ("user", "1")], 1.0);
    assert_ne!(a, b);
}

#[test]
fn returns_64_hex() {
    let k = key("c", &[("user", "x")], 1.0);
    assert_eq!(k.len(), 64);
    assert!(k.chars().all(|c| c.is_ascii_hexdigit()));
}