compute_hash

Function compute_hash 

Source
pub fn compute_hash(input: &str) -> String
Expand description

Compute a 5-character base62 hash from an input string

Uses xxHash3 with the WDP seed 0x000031762D706477 to ensure deterministic results across compilations and platforms.

Note: This function does NOT normalize input (no uppercase conversion). For WDP-conformant hashing with normalization, use compute_wdp_hash.

§Examples

use waddling_errors_hash::compute_hash;

let hash = compute_hash("E.AUTH.TOKEN.001");
assert_eq!(hash.len(), 5);
assert!(hash.chars().all(|c| c.is_ascii_alphanumeric()));

§Determinism

The same input will always produce the same hash:

use waddling_errors_hash::compute_hash;

let hash1 = compute_hash("E.AUTH.TOKEN.001");
let hash2 = compute_hash("E.AUTH.TOKEN.001");
assert_eq!(hash1, hash2);
Examples found in repository?
examples/global_config.rs (line 37)
29fn main() {
30    println!("🦆 WDP-Compliant Hash Configuration Example");
31    println!("===========================================\n");
32
33    // 1. Default behavior (WDP-compliant)
34    println!("1. WDP-Compliant Default Configuration");
35    println!("   Algorithm: xxHash3 (WDP-specified)");
36    println!("   Seed: 0x{:016X} (WDP v1 seed)", WDP_SEED);
37    let default_hash = compute_hash("E.AUTH.TOKEN.001");
38    println!("   Hash: {}\n", default_hash);
39
40    // 2. Load global configuration
41    println!("2. Load Global Configuration");
42    let global_config = load_global_config();
43    println!("   Algorithm: {}", global_config.algorithm.as_str());
44    println!("   Seed: 0x{:016X}", global_config.seed);
45
46    let global_hash = compute_hash_with_config("E.AUTH.TOKEN.001", &global_config);
47    println!("   Hash: {}\n", global_hash);
48
49    // 3. Per-diagnostic seed overrides (for testing/isolation)
50    println!("3. Custom Seed Override (for testing)");
51
52    // Override seed (e.g., for tenant isolation in tests)
53    let custom_seed_config = apply_overrides(&global_config, Some(0x12345678));
54    let custom_seed_hash = compute_hash_with_config("E.AUTH.TOKEN.001", &custom_seed_config);
55    println!("   Override seed to 0x12345678:");
56    println!("   Hash: {}", custom_seed_hash);
57
58    // No override (uses global)
59    let no_override_config = apply_overrides(&global_config, None);
60    let no_override_hash = compute_hash_with_config("E.AUTH.TOKEN.001", &no_override_config);
61    println!("   No override (same as global):");
62    println!("   Hash: {}\n", no_override_hash);
63
64    // 4. Different error codes with same config
65    println!("4. Multiple Error Codes (same config)");
66    let codes = [
67        "E.AUTH.TOKEN.001",
68        "E.AUTH.SESSION.002",
69        "E.DB.CONNECTION.003",
70        "E.CACHE.MISS.004",
71    ];
72
73    for code in &codes {
74        let hash = compute_hash_with_config(code, &global_config);
75        println!("   {} → {}", code, hash);
76    }
77
78    println!("\n✅ WDP-compliant hashes ensure cross-platform consistency!");
79
80    // 5. Configuration priority demonstration
81    println!("\n5. Configuration Priority Order");
82    println!("   1. Per-diagnostic seed override (highest)");
83    println!("   2. Environment variable WADDLING_HASH_SEED");
84    println!("   3. Cargo.toml hash_seed");
85    println!("   4. WDP default seed (0x000031762D706477)\n");
86
87    // Check if environment variable is set
88    match option_env!("WADDLING_HASH_SEED") {
89        Some(seed) => {
90            println!("   📌 Environment variable detected:");
91            println!("      WADDLING_HASH_SEED={}", seed);
92        }
93        None => {
94            println!("   ℹ️  No environment variable set");
95            println!("      Using WDP default seed");
96        }
97    }
98
99    println!("\n🎯 WDP ensures cross-language compatibility!");
100    println!("   Same error code produces same hash in:");
101    println!("   - Rust, Python, JavaScript, Go, Java, C, etc.");
102}