Skip to content

Commit 693bc57

Browse files
committed
Implemented Hash trait
1 parent 645154c commit 693bc57

File tree

8 files changed

+83
-1
lines changed

8 files changed

+83
-1
lines changed

src/auto.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ pub(crate) type Bvp = Bv128;
5252
/// assert_eq!(c.len(), 256);
5353
/// assert_eq!(c.to_string(), "26");
5454
/// ```
55-
#[derive(Clone, Debug)]
55+
#[derive(Clone, Debug, Hash)]
5656
pub enum Bv {
5757
#[doc(hidden)]
5858
Fixed(Bvp),

src/dynamic.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::cmp::Ordering;
22
use std::fmt;
3+
use std::hash::{Hash, Hasher};
34
use std::io::{Read, Write};
45
use std::iter::repeat;
56
use std::mem::size_of;
@@ -621,6 +622,19 @@ impl BitVector for Bvd {
621622
}
622623
}
623624

625+
// ------------------------------------------------------------------------------------------------
626+
// Bvd - Hasher Implementation
627+
// ------------------------------------------------------------------------------------------------
628+
629+
impl Hash for Bvd {
630+
fn hash<H: Hasher>(&self, state: &mut H) {
631+
self.length.hash(state);
632+
for i in 0..Self::capacity_from_bit_len(self.length) {
633+
self.data[i].hash(state);
634+
}
635+
}
636+
}
637+
624638
// ------------------------------------------------------------------------------------------------
625639
// Bvd - Bit iterator traits
626640
// ------------------------------------------------------------------------------------------------

src/fixed.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::cmp::Ordering;
22
use std::fmt;
3+
use std::hash::{Hash, Hasher};
34
use std::iter::repeat;
45
use std::mem::size_of;
56
use std::ops::{
@@ -619,6 +620,19 @@ where
619620
}
620621
}
621622

623+
// ------------------------------------------------------------------------------------------------
624+
// Bvf - Hasher Implementation
625+
// ------------------------------------------------------------------------------------------------
626+
627+
impl<I: Integer, const N: usize> Hash for Bvf<I, N> {
628+
fn hash<H: Hasher>(&self, state: &mut H) {
629+
self.length.hash(state);
630+
for i in 0..Self::capacity_from_bit_len(self.length) {
631+
self.data[i].hash(state);
632+
}
633+
}
634+
}
635+
622636
// ------------------------------------------------------------------------------------------------
623637
// Bvf - Bit iterator trait
624638
// ------------------------------------------------------------------------------------------------

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
)]
105105

106106
use std::fmt::{Binary, Debug, Display, LowerHex, Octal, UpperHex};
107+
use std::hash::Hash;
107108
use std::io::{Read, Write};
108109
use std::ops::Range;
109110

@@ -164,6 +165,7 @@ pub trait BitVector:
164165
+ Debug
165166
+ Display
166167
+ Eq
168+
+ Hash
167169
+ IArray
168170
+ IArrayMut
169171
+ LowerHex

src/tests/auto.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
use std::hash::{DefaultHasher, Hash, Hasher};
2+
13
use crate::auto::Bv;
24
use crate::bit::Bit;
5+
use crate::tests::random_bv;
36
use crate::BitVector;
47

58
#[test]
@@ -14,3 +17,16 @@ fn shrink_to_fit_bv() {
1417
assert_eq!(bv, Bv::ones(length));
1518
}
1619
}
20+
21+
#[test]
22+
fn hash() {
23+
for length in 0..512 {
24+
let bv1 = random_bv::<Bv>(length);
25+
let bv2 = random_bv::<Bv>(length);
26+
let mut hasher1 = DefaultHasher::new();
27+
let mut hasher2 = DefaultHasher::new();
28+
bv1.hash(&mut hasher1);
29+
bv2.hash(&mut hasher2);
30+
assert_eq!(hasher1.finish() == hasher2.finish(), bv1 == bv2);
31+
}
32+
}

src/tests/dynamic.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::hash::{DefaultHasher, Hash, Hasher};
2+
13
use crate::bit::Bit;
24
use crate::dynamic::Bvd;
35
use crate::tests::random_bv;
@@ -13,6 +15,19 @@ fn new_into() {
1315
}
1416
}
1517

18+
#[test]
19+
fn hash() {
20+
for length in 0..512 {
21+
let bv1 = random_bv::<Bvd>(length);
22+
let bv2 = random_bv::<Bvd>(length);
23+
let mut hasher1 = DefaultHasher::new();
24+
let mut hasher2 = DefaultHasher::new();
25+
bv1.hash(&mut hasher1);
26+
bv2.hash(&mut hasher2);
27+
assert_eq!(hasher1.finish() == hasher2.finish(), bv1 == bv2);
28+
}
29+
}
30+
1631
#[test]
1732
fn shrink_to_fit_bvd() {
1833
let capacity = 512;

src/tests/fixed.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::hash::{DefaultHasher, Hash, Hasher};
2+
13
use crate::fixed::Bvf;
24
use crate::tests::{bvf_inner_unroll, random_bv};
35
use crate::utils::Integer;
@@ -11,7 +13,24 @@ fn new_into_inner<I: Integer, const N: usize>() {
1113
}
1214
}
1315

16+
fn hash_inner<I: Integer, const N: usize>() {
17+
for length in 0..Bvf::<I, N>::capacity() {
18+
let bv1 = random_bv::<Bvf<I, N>>(length);
19+
let bv2 = random_bv::<Bvf<I, N>>(length);
20+
let mut hasher1 = DefaultHasher::new();
21+
let mut hasher2 = DefaultHasher::new();
22+
bv1.hash(&mut hasher1);
23+
bv2.hash(&mut hasher2);
24+
assert_eq!(hasher1.finish() == hasher2.finish(), bv1 == bv2);
25+
}
26+
}
27+
1428
#[test]
1529
fn new_into() {
1630
bvf_inner_unroll!(new_into_inner, {u8, u16, u32, u64, u128}, {1, 2, 3, 4, 5});
1731
}
32+
33+
#[test]
34+
fn hash() {
35+
bvf_inner_unroll!(hash_inner, {u8, u16, u32, u64, u128}, {1, 2, 3, 4, 5});
36+
}

src/utils.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::fmt::{Debug, Display};
2+
use std::hash::Hash;
23
use std::mem::{align_of, size_of, size_of_val};
34
use std::ops::{
45
Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Div, DivAssign,
@@ -80,6 +81,7 @@ pub trait Integer:
8081
+ Display
8182
+ Eq
8283
+ From<Bit>
84+
+ Hash
8385
+ Into<Bit>
8486
+ Mul<Output = Self>
8587
+ MulAssign

0 commit comments

Comments
 (0)