@@ -279,6 +279,10 @@ static inline uint8_t binary_fuse_mod3(uint8_t x) {
279279// many duplicated keys.
280280static inline bool binary_fuse8_populate (uint64_t * keys , uint32_t size ,
281281 binary_fuse8_t * filter ) {
282+ if (size != filter -> Size ) {
283+ return false;
284+ }
285+
282286 uint64_t rng_counter = 0x726b2b9d438b9d4d ;
283287 filter -> Seed = binary_fuse_rng_splitmix64 (& rng_counter );
284288 uint64_t * reverseOrder = (uint64_t * )calloc ((size + 1 ), sizeof (uint64_t ));
@@ -569,6 +573,10 @@ static inline void binary_fuse16_free(binary_fuse16_t *filter) {
569573// many duplicated keys.
570574static inline bool binary_fuse16_populate (uint64_t * keys , uint32_t size ,
571575 binary_fuse16_t * filter ) {
576+ if (size != filter -> Size ) {
577+ return false;
578+ }
579+
572580 uint64_t rng_counter = 0x726b2b9d438b9d4d ;
573581 filter -> Seed = binary_fuse_rng_splitmix64 (& rng_counter );
574582 uint64_t * reverseOrder = (uint64_t * )calloc ((size + 1 ), sizeof (uint64_t ));
@@ -747,14 +755,14 @@ static inline bool binary_fuse16_populate(uint64_t *keys, uint32_t size,
747755}
748756
749757static inline size_t binary_fuse16_serialization_bytes (binary_fuse16_t * filter ) {
750- return sizeof (filter -> Seed ) + sizeof (filter -> SegmentLength ) +
758+ return sizeof (filter -> Seed ) + sizeof (filter -> Size ) + sizeof ( filter -> SegmentLength ) +
751759 sizeof (filter -> SegmentLengthMask ) + sizeof (filter -> SegmentCount ) +
752760 sizeof (filter -> SegmentCountLength ) + sizeof (filter -> ArrayLength ) +
753761 sizeof (uint16_t ) * filter -> ArrayLength ;
754762}
755763
756764static inline size_t binary_fuse8_serialization_bytes (const binary_fuse8_t * filter ) {
757- return sizeof (filter -> Seed ) + sizeof (filter -> SegmentLength ) +
765+ return sizeof (filter -> Seed ) + sizeof (filter -> Size ) + sizeof ( filter -> SegmentLength ) +
758766 sizeof (filter -> SegmentCount ) +
759767 sizeof (filter -> SegmentCountLength ) + sizeof (filter -> ArrayLength ) +
760768 sizeof (uint8_t ) * filter -> ArrayLength ;
@@ -766,6 +774,8 @@ static inline size_t binary_fuse8_serialization_bytes(const binary_fuse8_t *filt
766774static inline void binary_fuse16_serialize (const binary_fuse16_t * filter , char * buffer ) {
767775 memcpy (buffer , & filter -> Seed , sizeof (filter -> Seed ));
768776 buffer += sizeof (filter -> Seed );
777+ memcpy (buffer , & filter -> Size , sizeof (filter -> Size ));
778+ buffer += sizeof (filter -> Size );
769779 memcpy (buffer , & filter -> SegmentLength , sizeof (filter -> SegmentLength ));
770780 buffer += sizeof (filter -> SegmentLength );
771781 memcpy (buffer , & filter -> SegmentCount , sizeof (filter -> SegmentCount ));
@@ -783,6 +793,8 @@ static inline void binary_fuse16_serialize(const binary_fuse16_t *filter, char *
783793static inline void binary_fuse8_serialize (const binary_fuse8_t * filter , char * buffer ) {
784794 memcpy (buffer , & filter -> Seed , sizeof (filter -> Seed ));
785795 buffer += sizeof (filter -> Seed );
796+ memcpy (buffer , & filter -> Size , sizeof (filter -> Size ));
797+ buffer += sizeof (filter -> Size );
786798 memcpy (buffer , & filter -> SegmentLength , sizeof (filter -> SegmentLength ));
787799 buffer += sizeof (filter -> SegmentLength );
788800 memcpy (buffer , & filter -> SegmentCount , sizeof (filter -> SegmentCount ));
@@ -802,6 +814,8 @@ static inline void binary_fuse8_serialize(const binary_fuse8_t *filter, char *bu
802814static inline const char * binary_fuse16_deserialize_header (binary_fuse16_t * filter , const char * buffer ) {
803815 memcpy (& filter -> Seed , buffer , sizeof (filter -> Seed ));
804816 buffer += sizeof (filter -> Seed );
817+ memcpy (& filter -> Size , buffer , sizeof (filter -> Size ));
818+ buffer += sizeof (filter -> Size );
805819 memcpy (& filter -> SegmentLength , buffer , sizeof (filter -> SegmentLength ));
806820 buffer += sizeof (filter -> SegmentLength );
807821 filter -> SegmentLengthMask = filter -> SegmentLength - 1 ;
@@ -837,6 +851,8 @@ static inline bool binary_fuse16_deserialize(binary_fuse16_t * filter, const cha
837851static inline const char * binary_fuse8_deserialize_header (binary_fuse8_t * filter , const char * buffer ) {
838852 memcpy (& filter -> Seed , buffer , sizeof (filter -> Seed ));
839853 buffer += sizeof (filter -> Seed );
854+ memcpy (& filter -> Size , buffer , sizeof (filter -> Size ));
855+ buffer += sizeof (filter -> Size );
840856 memcpy (& filter -> SegmentLength , buffer , sizeof (filter -> SegmentLength ));
841857 buffer += sizeof (filter -> SegmentLength );
842858 filter -> SegmentLengthMask = filter -> SegmentLength - 1 ;
0 commit comments