memory_cache_rust/bloom/
haskey.rs1use std::any::TypeId;
2use std::mem::size_of;
3use std::ops::Deref;
4
5use xxhash_rust::const_xxh3::xxh3_64 as const_xxh3;
6
7use crate::bloom::rutil::mem_hash;
8
9pub type KeyHash<T> = Box<dyn FnMut(T) -> (u64, i64)>;
10
11
12
13pub fn key_to_hash<T: Copy + 'static + std::fmt::Display>(key: & T) -> (u64, u64)
14 where
15
16{
17 let key = *key.deref();
18 if equals::<T, String>() {
19 let v = cast_ref::<_, String>(&key).unwrap();
20 let raw = v.as_bytes();
21 return (mem_hash(raw), const_xxh3(raw) as u64);
22 }
23
24
25 if equals::<T, u64>() {
33 let value = cast_ref::<_, u64>(&key).unwrap();
34 return (*value, 0);
35 }
36
37 if equals::<T, usize>() {
38 let value = cast_ref::<_, usize>(&key).unwrap();
39 return (*value as u64, 0);
40 }
41
42
43 if equals::<T, i64>() {
44 let value = cast_ref::<_, i64>(&key).unwrap();
45 return (*value as u64, 0);
46 }
47
48
49 if equals::<T, i32>() {
50 let value = cast_ref::<_, i32>(&key).unwrap();
51
52 return (*value as u64, 0);
53 }
54
55 if equals::<T, u8>() {
56 let value = cast_ref::<_, u8>(&key).unwrap();
57 return (*value as u64, 0);
58 }
59 if equals::<T, u16>() {
60 let value = cast_ref::<_, u16>(&key).unwrap();
61
62 return (*value as u64, 0);
63 }
64 if equals::<T, u32>() {
65 let value = cast_ref::<_, u32>(&key).unwrap();
66
67 return (*value as u64, 0);
68 }
69 if equals::<T, i16>() {
70 let value = cast_ref::<_, i16>(&key).unwrap();
71
72 return (*value as u64, 0);
73 }
74
75 let f = format!("{}",key);
76
77 match cast_ref::<_, String>(&f) {
78 None => {
79 panic!("not suported");
80 }
81 Some(v) => {
82 let raw = v.as_bytes();
83 return (mem_hash(raw), const_xxh3(raw) as u64);
84 }
85 }
86
87
88 }
97
98
99pub fn value_to_int<T: 'static>(key: T) -> i64 {
100 if equals::<T, u64>() {
101 let value = cast_ref::<_, u64>(&key).unwrap();
102 return *value as i64;
103 }
104
105 if equals::<T, usize>() {
106 let value = cast_ref::<_, usize>(&key).unwrap();
107 return *value as i64;
108 }
109
110
111 if equals::<T, i64>() {
112 let value = cast_ref::<_, i64>(&key).unwrap();
113 return *value as i64;
114 }
115
116
117 if equals::<T, i32>() {
118 let value = cast_ref::<_, i32>(&key).unwrap();
119
120 return *value as i64;
121 }
122
123 if equals::<T, u8>() {
124 let value = cast_ref::<_, u8>(&key).unwrap();
125 return *value as i64;
126 }
127 if equals::<T, u16>() {
128 let value = cast_ref::<_, u16>(&key).unwrap();
129
130 return *value as i64;
131 }
132 if equals::<T, u32>() {
133 let value = cast_ref::<_, u32>(&key).unwrap();
134
135 return *value as i64;
136 }
137 if equals::<T, i16>() {
138 let value = cast_ref::<_, i16>(&key).unwrap();
139
140 return *value as i64;
141 }
142 panic!("! value type not supported")
143}
144
145pub fn equals<U: 'static, V: 'static>() -> bool {
146 TypeId::of::<U>() == TypeId::of::<V>() && size_of::<U>() == size_of::<V>()
147}
148
149pub fn cast_ref<U: 'static, V: 'static>(u: &U) -> Option<&V> {
150 if equals::<U, V>() {
151 Some(unsafe { std::mem::transmute::<&U, &V>(u) })
152 } else {
153 None
154 }
155}
156
157pub fn cast_mut<U: 'static, V: 'static>(u: &mut U) -> Option<&mut V> {
158 if equals::<U, V>() {
159 Some(unsafe { std::mem::transmute::<&mut U, &mut V>(u) })
160 } else {
161 None
162 }
163}
164
165#[cfg(test)]
166mod tests {
167 use super::*;
168
169 #[test]
170 fn test_hash() {
171 let a ="22";
172 let d = key_to_hash(&a);
173 ;
174 println!("{:?}", d);
175 }
176}