Skip to content

Commit 391fcdb

Browse files
committed
Naive hash function
1 parent c6da898 commit 391fcdb

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

pyroaring/abstract_bitmap.pxi

+29
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,7 @@ cdef class AbstractBitMap64:
769769
An efficient and light-weight ordered set of 64 bits integers.
770770
"""
771771
cdef croaring.roaring64_bitmap_t* _c_bitmap
772+
cdef int64_t _h_val
772773

773774
def __cinit__(self, values=None, optimize=True, no_init=False):
774775
if no_init:
@@ -780,6 +781,7 @@ cdef class AbstractBitMap64:
780781
self._c_bitmap = croaring.roaring64_bitmap_create()
781782
elif isinstance(values, AbstractBitMap64):
782783
self._c_bitmap = croaring.roaring64_bitmap_copy((<AbstractBitMap64?>values)._c_bitmap)
784+
self._h_val = (<AbstractBitMap64?>values)._h_val
783785
elif isinstance(values, range):
784786
_, (start, stop, step) = values.__reduce__()
785787
if step < 0:
@@ -806,6 +808,8 @@ cdef class AbstractBitMap64:
806808
if size > 0:
807809
buff_vect = values
808810
croaring.roaring64_bitmap_add_many(self._c_bitmap, size, &buff_vect[0])
811+
if not isinstance(values, AbstractBitMap64):
812+
self._h_val = 0
809813
if optimize:
810814
self.run_optimize()
811815

@@ -891,6 +895,31 @@ cdef class AbstractBitMap64:
891895
raise AssertionError('range_end must not be lower than range_start')
892896
return croaring.roaring64_bitmap_range_cardinality(self._c_bitmap, range_start, range_end)
893897

898+
cdef compute_hash(self):
899+
cdef int64_t h_val = 0
900+
cdef uint32_t i, count, max_count=256
901+
cdef croaring.roaring64_iterator_t *iterator = croaring.roaring64_iterator_create(self._c_bitmap)
902+
cdef uint64_t *buff = <uint64_t*>malloc(max_count*8)
903+
while True:
904+
count = croaring.roaring64_iterator_read(iterator, buff, max_count)
905+
i = 0
906+
while i < count:
907+
h_val += buff[i]
908+
# TODO find a good hash formula
909+
i += 1
910+
if count != max_count:
911+
break
912+
croaring.roaring64_iterator_free(iterator)
913+
free(buff)
914+
if not self:
915+
return -1
916+
return h_val
917+
918+
def __hash__(self):
919+
if self._h_val == 0:
920+
self._h_val = self.compute_hash()
921+
return self._h_val
922+
894923
def iter_equal_or_larger(self, uint64_t val):
895924
"""
896925
Iterate over items in the bitmap equal or larger than a given value.

0 commit comments

Comments
 (0)