pub const DIGEST_SIZE: usize = 32;
pub const SIZE_SIZE: usize = std::mem::size_of::<u16>();
pub const PARITY: u8 = 7;
pub const PARITY_SIZE: usize = 2 * PARITY as usize;
pub const PARITY_OFFSET: usize = DIGEST_SIZE + SIZE_SIZE;
pub const HASH_SIZE_BIN: usize = PARITY_OFFSET + PARITY_SIZE;
pub const HASH_SIZE_COMPACT: usize = MIN_RECOVERABLE_BIN + 1;
pub const HASH_SIZE_CROCKFORD: usize = encoded_size(CROCKFORD_BITS);
pub const HASH_SIZE_BASE64: usize = encoded_size(BASE64_BITS);
pub const MIN_RECOVERABLE_BIN: usize = HASH_SIZE_BIN - PARITY as usize;
pub const MIN_RECOVERABLE_CROCKFORD: usize =
HASH_SIZE_CROCKFORD - recoverable_truncation(CROCKFORD_BITS);
pub const MIN_RECOVERABLE_BASE64: usize = HASH_SIZE_BASE64 - recoverable_truncation(BASE64_BITS);
const CROCKFORD_BITS: usize = 5;
const BASE64_BITS: usize = 6;
const fn encoded_size(bits_per_char: usize) -> usize {
(HASH_SIZE_BIN * 8).div_ceil(bits_per_char)
}
const fn recoverable_truncation(bits_per_char: usize) -> usize {
PARITY as usize * 8 / bits_per_char
}
const _: () = {
assert!(MIN_RECOVERABLE_BIN <= HASH_SIZE_BIN);
assert!(HASH_SIZE_BIN < MIN_RECOVERABLE_BASE64);
assert!(MIN_RECOVERABLE_BASE64 <= HASH_SIZE_BASE64);
assert!(HASH_SIZE_BASE64 < MIN_RECOVERABLE_CROCKFORD);
assert!(MIN_RECOVERABLE_CROCKFORD <= HASH_SIZE_CROCKFORD);
};
const _: () = {
assert!(HASH_SIZE_COMPACT >= MIN_RECOVERABLE_BIN);
assert!(HASH_SIZE_COMPACT <= HASH_SIZE_BIN);
};
const _: () = {
assert!(HASH_SIZE_CROCKFORD * CROCKFORD_BITS >= HASH_SIZE_BIN * 8);
assert!(HASH_SIZE_BASE64 * BASE64_BITS >= HASH_SIZE_BIN * 8);
};
#[cfg(test)]
mod tests {
use super::{
DIGEST_SIZE, HASH_SIZE_BASE64, HASH_SIZE_BIN, HASH_SIZE_COMPACT, HASH_SIZE_CROCKFORD,
MIN_RECOVERABLE_BASE64, MIN_RECOVERABLE_BIN, MIN_RECOVERABLE_CROCKFORD, PARITY,
PARITY_OFFSET, PARITY_SIZE, SIZE_SIZE,
};
#[test]
fn constants_are_consistent() {
assert_eq!(DIGEST_SIZE, 32);
assert_eq!(SIZE_SIZE, 2);
assert_eq!(PARITY, 7);
assert_eq!(PARITY_SIZE, 14);
assert_eq!(PARITY_OFFSET, 34);
assert_eq!(HASH_SIZE_BIN, 48);
assert_eq!(HASH_SIZE_COMPACT, 42);
assert_eq!(HASH_SIZE_CROCKFORD, 77);
assert_eq!(HASH_SIZE_BASE64, 64);
assert_eq!(MIN_RECOVERABLE_BIN, 41);
assert_eq!(MIN_RECOVERABLE_CROCKFORD, 66);
assert_eq!(MIN_RECOVERABLE_BASE64, 55);
}
}