1pub const EMOJI: [&str; 64] = [
12 "๐ต", "๐ถ", "๐บ", "๐ฆ", "๐ฑ", "๐ฆ", "๐ฏ", "๐ด", "๐ฆ", "๐ฆ", "๐ฆ", "๐ฎ", "๐ท", "๐", "๐ญ", "๐น",
13 "๐ฐ", "๐ป", "๐ผ", "๐จ", "๐ธ", "๐ฒ", "๐", "๐ง", "๐ฆ", "๐ฆ
", "๐ฆ", "๐ฆ", "๐ข", "๐", "๐ฆ", "๐",
14 "๐ณ", "๐ฌ", "๐", "๐ ", "๐ก", "๐ฆ", "๐", "๐ฆ", "๐ฆ", "๐ฆ", "๐ฆ", "๐ฆ", "๐", "๐", "๐", "๐",
15 "๐ฆ", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐ฅ", "๐", "๐ฅฅ", "๐ฅ", "๐ฝ",
16];
17
18pub const LABELS: [&str; 64] = [
20 "monkey",
21 "dog",
22 "wolf",
23 "fox",
24 "cat",
25 "lion",
26 "tiger",
27 "horse",
28 "unicorn",
29 "zebra",
30 "deer",
31 "cow",
32 "pig",
33 "boar",
34 "mouse",
35 "hamster",
36 "rabbit",
37 "bear",
38 "panda",
39 "koala",
40 "frog",
41 "dragon",
42 "chicken",
43 "penguin",
44 "duck",
45 "eagle",
46 "owl",
47 "bat",
48 "turtle",
49 "snake",
50 "lizard",
51 "crocodile",
52 "whale",
53 "dolphin",
54 "fish",
55 "tropical-fish",
56 "blowfish",
57 "shark",
58 "octopus",
59 "squid",
60 "crab",
61 "lobster",
62 "shrimp",
63 "butterfly",
64 "snail",
65 "lady-beetle",
66 "bee",
67 "ant",
68 "scorpion",
69 "apple",
70 "pear",
71 "orange",
72 "lemon",
73 "banana",
74 "watermelon",
75 "grapes",
76 "strawberry",
77 "cherries",
78 "pineapple",
79 "kiwi",
80 "peach",
81 "coconut",
82 "carrot",
83 "corn",
84];
85
86pub const ALPHABET_SIZE: usize = 64;
88
89pub fn emoji_indices(data: &[u8], length: usize) -> Vec<usize> {
91 let wanted = length.max(1);
92 let nbytes = (wanted * 6).div_ceil(8);
93 let mut digest = vec![0u8; nbytes];
94 blake3::Hasher::new()
95 .update(data)
96 .finalize_xof()
97 .fill(&mut digest);
98
99 let mut out = Vec::with_capacity(wanted);
100 let mut acc: u64 = 0;
101 let mut bits: u32 = 0;
102 for byte in digest {
103 acc = (acc << 8) | u64::from(byte);
104 bits += 8;
105 while bits >= 6 && out.len() < wanted {
106 bits -= 6;
107 out.push(((acc >> bits) & 0x3f) as usize);
108 }
109 acc &= (1u64 << bits) - 1; }
111 out.truncate(wanted);
112 out
113}
114
115pub fn emojihash(data: &[u8], length: usize) -> String {
117 emoji_indices(data, length)
118 .into_iter()
119 .map(|i| EMOJI[i])
120 .collect::<Vec<_>>()
121 .join(" ")
122}
123
124pub fn emojihash_labels(data: &[u8], length: usize) -> String {
126 emoji_indices(data, length)
127 .into_iter()
128 .map(|i| LABELS[i])
129 .collect::<Vec<_>>()
130 .join(" ")
131}