1use std::hash::{DefaultHasher, Hash, Hasher};
12
13use rustolio_utils::prelude::*;
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Decode, Encode)]
16pub struct Key {
17 hash: u64,
18 ty: KeyType,
19}
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Decode, Encode)]
22pub enum KeyType {
23 ReadWrite,
24 ReadSecureWrite,
25 SecureReadWrite,
26}
27
28impl Key {
29 pub fn from_value(value: &impl std::hash::Hash, ty: KeyType) -> Self {
30 let mut hasher = DefaultHasher::new();
32 value.hash(&mut hasher);
33 ty.hash(&mut hasher);
34 let hash = hasher.finish();
35 Self { hash, ty }
36 }
37
38 pub fn hash(&self) -> u64 {
39 self.hash
40 }
41
42 pub fn ty(&self) -> KeyType {
43 self.ty
44 }
45}
46
47impl std::hash::Hash for Key {
52 fn hash<H: Hasher>(&self, state: &mut H) {
53 state.write_u64(self.hash);
54 }
55}
56
57pub type KeyState = std::hash::BuildHasherDefault<KeyHasher>;
58
59#[derive(Debug, Default)]
60pub struct KeyHasher {
61 state: u64,
62}
63
64impl Hasher for KeyHasher {
65 fn finish(&self) -> u64 {
66 self.state
67 }
68
69 fn write(&mut self, _: &[u8]) {
70 unreachable!("write_u64 should always be used");
71 }
72
73 fn write_u64(&mut self, i: u64) {
74 self.state = i;
75 }
76}