assembly_fdb_core/
hash.rs

1//! # Implements primary key hashing
2//!
3
4use std::ops::Deref;
5
6use latin1str::{Latin1Str, Latin1String};
7
8use crate::value::{Context, Value};
9
10/// This trait is implemented on all types that represent a field value
11pub trait FdbHash {
12    /// Get the hash value
13    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            // FIXME: This may not be correct
94            Value::VarChar(v) => FdbHash::hash(v),
95        }
96    }
97}