ps_hash_core/
constants.rs1pub const DIGEST_SIZE: usize = 32;
3
4pub const SIZE_SIZE: usize = std::mem::size_of::<u16>();
6
7pub const PARITY: u8 = 7;
9
10pub const PARITY_SIZE: usize = 2 * PARITY as usize;
12
13pub const PARITY_OFFSET: usize = DIGEST_SIZE + SIZE_SIZE;
15
16pub const HASH_SIZE_BIN: usize = PARITY_OFFSET + PARITY_SIZE;
26
27pub const HASH_SIZE_COMPACT: usize = MIN_RECOVERABLE_BIN + 1;
35
36pub const HASH_SIZE_CROCKFORD: usize = encoded_size(CROCKFORD_BITS);
38
39pub const HASH_SIZE_BASE64: usize = encoded_size(BASE64_BITS);
41
42pub const MIN_RECOVERABLE_BIN: usize = HASH_SIZE_BIN - PARITY as usize;
46
47pub const MIN_RECOVERABLE_CROCKFORD: usize =
51 HASH_SIZE_CROCKFORD - recoverable_truncation(CROCKFORD_BITS);
52
53pub const MIN_RECOVERABLE_BASE64: usize = HASH_SIZE_BASE64 - recoverable_truncation(BASE64_BITS);
57
58const CROCKFORD_BITS: usize = 5;
60
61const BASE64_BITS: usize = 6;
63
64const fn encoded_size(bits_per_char: usize) -> usize {
66 (HASH_SIZE_BIN * 8).div_ceil(bits_per_char)
67}
68
69const fn recoverable_truncation(bits_per_char: usize) -> usize {
72 PARITY as usize * 8 / bits_per_char
73}
74
75const _: () = {
80 assert!(MIN_RECOVERABLE_BIN <= HASH_SIZE_BIN);
81 assert!(HASH_SIZE_BIN < MIN_RECOVERABLE_BASE64);
82
83 assert!(MIN_RECOVERABLE_BASE64 <= HASH_SIZE_BASE64);
84 assert!(HASH_SIZE_BASE64 < MIN_RECOVERABLE_CROCKFORD);
85
86 assert!(MIN_RECOVERABLE_CROCKFORD <= HASH_SIZE_CROCKFORD);
87};
88
89const _: () = {
92 assert!(HASH_SIZE_COMPACT >= MIN_RECOVERABLE_BIN);
93 assert!(HASH_SIZE_COMPACT <= HASH_SIZE_BIN);
94};
95
96const _: () = {
98 assert!(HASH_SIZE_CROCKFORD * CROCKFORD_BITS >= HASH_SIZE_BIN * 8);
99 assert!(HASH_SIZE_BASE64 * BASE64_BITS >= HASH_SIZE_BIN * 8);
100};
101
102#[cfg(test)]
103mod tests {
104 use super::{
105 DIGEST_SIZE, HASH_SIZE_BASE64, HASH_SIZE_BIN, HASH_SIZE_COMPACT, HASH_SIZE_CROCKFORD,
106 MIN_RECOVERABLE_BASE64, MIN_RECOVERABLE_BIN, MIN_RECOVERABLE_CROCKFORD, PARITY,
107 PARITY_OFFSET, PARITY_SIZE, SIZE_SIZE,
108 };
109
110 #[test]
113 fn constants_are_consistent() {
114 assert_eq!(DIGEST_SIZE, 32);
115 assert_eq!(SIZE_SIZE, 2);
116 assert_eq!(PARITY, 7);
117 assert_eq!(PARITY_SIZE, 14);
118 assert_eq!(PARITY_OFFSET, 34);
119 assert_eq!(HASH_SIZE_BIN, 48);
120 assert_eq!(HASH_SIZE_COMPACT, 42);
121 assert_eq!(HASH_SIZE_CROCKFORD, 77);
122 assert_eq!(HASH_SIZE_BASE64, 64);
123 assert_eq!(MIN_RECOVERABLE_BIN, 41);
124 assert_eq!(MIN_RECOVERABLE_CROCKFORD, 66);
125 assert_eq!(MIN_RECOVERABLE_BASE64, 55);
126 }
127}