tetsy_trie_standardmap/
lib.rs1use tetsy_hash_db::Hasher;
18use tetsy_keccak_hasher::KeccakHasher;
19
20type H256 = <KeccakHasher as tetsy_hash_db::Hasher>::Out;
21
22pub enum Alphabet {
24 All,
26 Low,
28 Mid,
30 Custom(Vec<u8>),
32}
33
34pub enum ValueMode {
36 Mirror,
38 Random,
40 Index,
42}
43
44pub struct StandardMap {
46 pub alphabet: Alphabet,
48 pub min_key: usize,
50 pub journal_key: usize,
52 pub value_mode: ValueMode,
54 pub count: u32,
56}
57
58impl StandardMap {
59 fn random_bytes(min_count: usize, journal_count: usize, seed: &mut H256) -> Vec<u8> {
62 assert!(min_count + journal_count <= 32);
63 *seed = KeccakHasher::hash(&seed[..]);
64 let r = min_count + (seed[31] as usize % (journal_count + 1));
65 seed[0..r].to_vec()
66 }
67
68 fn random_value(seed: &mut H256) -> Vec<u8> {
70 *seed = KeccakHasher::hash(&seed[..]);
71 match seed[0] % 2 {
72 1 => vec![seed[31];1],
73 _ => seed.to_vec(),
74 }
75 }
76
77 fn random_word(alphabet: &[u8], min_count: usize, journal_count: usize, seed: &mut H256) -> Vec<u8> {
80 assert!(min_count + journal_count <= 32);
81 *seed = KeccakHasher::hash(&seed[..]);
82 let r = min_count + (seed[31] as usize % (journal_count + 1));
83 let mut ret: Vec<u8> = Vec::with_capacity(r);
84 for i in 0..r {
85 ret.push(alphabet[seed[i] as usize % alphabet.len()]);
86 }
87 ret
88 }
89
90 pub fn make(&self) -> Vec<(Vec<u8>, Vec<u8>)> {
92 self.make_with(&mut H256::default())
93 }
94
95 pub fn make_with(&self, seed: &mut H256) -> Vec<(Vec<u8>, Vec<u8>)> {
97 let low = b"abcdef";
98 let mid = b"@QWERTYUIOPASDFGHJKLZXCVBNM[/]^_";
99
100 let mut d: Vec<(Vec<u8>, Vec<u8>)> = Vec::new();
101 for index in 0..self.count {
102 let k = match self.alphabet {
103 Alphabet::All => Self::random_bytes(self.min_key, self.journal_key, seed),
104 Alphabet::Low => Self::random_word(low, self.min_key, self.journal_key, seed),
105 Alphabet::Mid => Self::random_word(mid, self.min_key, self.journal_key, seed),
106 Alphabet::Custom(ref a) => Self::random_word(a, self.min_key, self.journal_key, seed),
107 };
108 let v = match self.value_mode {
109 ValueMode::Mirror => k.clone(),
110 ValueMode::Random => Self::random_value(seed),
111 ValueMode::Index => vec![index as u8, (index >> 8) as u8, (index >> 16) as u8, (index >> 24) as u8],
112 };
113 d.push((k, v))
114 }
115 d
116 }
117}