assembly_fdb_core/
hash.rs1use std::ops::Deref;
5
6use latin1str::{Latin1Str, Latin1String};
7
8use crate::value::{Context, Value};
9
10pub trait FdbHash {
12 fn hash(&self) -> u32;
14}
15
16impl FdbHash for u32 {
17 fn hash(&self) -> u32 {
18 *self
19 }
20}
21
22impl FdbHash for i32 {
23 fn hash(&self) -> u32 {
24 u32::from_ne_bytes(self.to_ne_bytes())
25 }
26}
27
28impl FdbHash for f32 {
29 fn hash(&self) -> u32 {
30 u32::from_ne_bytes(self.to_ne_bytes())
31 }
32}
33
34impl FdbHash for Latin1Str {
35 fn hash(&self) -> u32 {
36 sfhash::digest(self.as_bytes())
37 }
38}
39
40impl FdbHash for Latin1String {
41 fn hash(&self) -> u32 {
42 FdbHash::hash(self.deref())
43 }
44}
45
46impl FdbHash for str {
47 fn hash(&self) -> u32 {
48 FdbHash::hash(Latin1String::encode(self).as_ref())
49 }
50}
51
52impl FdbHash for String {
53 fn hash(&self) -> u32 {
54 FdbHash::hash(self.as_str())
55 }
56}
57
58impl FdbHash for i64 {
59 fn hash(&self) -> u32 {
60 FdbHash::hash(&u64::from_ne_bytes(self.to_ne_bytes()))
61 }
62}
63
64impl FdbHash for u64 {
65 fn hash(&self) -> u32 {
66 (self & 0xFFFFFFFF) as u32
67 }
68}
69
70impl FdbHash for bool {
71 fn hash(&self) -> u32 {
72 match *self {
73 true => 1,
74 false => 0,
75 }
76 }
77}
78
79impl<C: Context> FdbHash for Value<C>
80where
81 C::I64: FdbHash,
82 C::String: FdbHash,
83 C::XML: FdbHash,
84{
85 fn hash(&self) -> u32 {
86 match self {
87 Value::Nothing => 0,
88 Value::Integer(i) => FdbHash::hash(i),
89 Value::Float(f) => FdbHash::hash(f),
90 Value::Text(f) => FdbHash::hash(f),
91 Value::Boolean(b) => FdbHash::hash(b),
92 Value::BigInt(i) => FdbHash::hash(i),
93 Value::VarChar(v) => FdbHash::hash(v),
95 }
96 }
97}