use dstu_core::hazmat::kupyna::{Kupyna256, Kupyna512};
struct SplitMix64(u64);
impl SplitMix64 {
fn next_u64(&mut self) -> u64 {
self.0 = self.0.wrapping_add(0x9E37_79B9_7F4A_7C15);
let mut z = self.0;
z = (z ^ (z >> 30)).wrapping_mul(0xBF58_476D_1CE4_E5B9);
z = (z ^ (z >> 27)).wrapping_mul(0x94D0_49BB_1331_11EB);
z ^ (z >> 31)
}
fn fill(&mut self, buf: &mut [u8]) {
for chunk in buf.chunks_mut(8) {
let word = self.next_u64().to_le_bytes();
chunk.copy_from_slice(&word[..chunk.len()]);
}
}
fn range(&mut self, max_inclusive: usize) -> usize {
(self.next_u64() as usize) % (max_inclusive + 1)
}
}
fn to_hex(bytes: &[u8]) -> String {
bytes.iter().map(|b| format!("{b:02X}")).collect()
}
fn main() {
let count: usize = std::env::args()
.nth(1)
.and_then(|s| s.parse().ok())
.unwrap_or(300);
let mut rng = SplitMix64(0x4B55_5059_4E41_3234);
for _ in 0..count {
let len = 1 + rng.range(499);
let mut message = vec![0u8; len];
rng.fill(&mut message);
let hash256 = Kupyna256::digest(&message);
println!("256 {} {}", to_hex(&message), to_hex(&hash256));
let hash512 = Kupyna512::digest(&message);
println!("512 {} {}", to_hex(&message), to_hex(&hash512));
}
}