Skip to content

Commit f2dd024

Browse files
Merge pull request #27 from borgbackup/fix-32bit-platforms
HashTable: fix issues on 32bit platforms
2 parents 9294927 + 976fd9e commit f2dd024

File tree

2 files changed

+21
-21
lines changed

2 files changed

+21
-21
lines changed

src/borghash/HashTable.pxd

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ from libc.stdint cimport uint8_t, uint32_t
22

33
cdef class HashTable:
44
cdef int ksize, vsize
5-
cdef readonly int capacity, used
6-
cdef int initial_capacity, tombstones
5+
cdef readonly size_t capacity, used
6+
cdef size_t initial_capacity, tombstones
77
cdef float max_load_factor, min_load_factor, shrink_factor, grow_factor
88
cdef uint32_t* table
9-
cdef int kv_capacity, kv_used
9+
cdef uint32_t kv_capacity, kv_used
1010
cdef float kv_grow_factor
1111
cdef uint8_t* keys
1212
cdef uint8_t* values
1313
cdef int stats_get, stats_set, stats_del, stats_iter, stats_lookup, stats_linear
1414
cdef int stats_resize_table, stats_resize_kv
1515

16-
cdef int _get_index(self, uint8_t* key)
17-
cdef int _lookup_index(self, uint8_t* key_ptr, int* index_ptr)
18-
cdef void _resize_table(self, int new_capacity)
19-
cdef void _resize_kv(self, int new_capacity)
16+
cdef size_t _get_index(self, uint8_t* key)
17+
cdef int _lookup_index(self, uint8_t* key_ptr, size_t* index_ptr)
18+
cdef void _resize_table(self, size_t new_capacity)
19+
cdef void _resize_kv(self, size_t new_capacity)

src/borghash/HashTable.pyx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,18 @@ cdef class HashTable:
106106
def __len__(self) -> int:
107107
return self.used
108108

109-
cdef int _get_index(self, uint8_t* key):
109+
cdef size_t _get_index(self, uint8_t* key):
110110
"""key must be perfectly random distributed bytes, so we don't need a hash function here."""
111111
cdef uint32_t key32 = (key[0] << 24) | (key[1] << 16) | (key[2] << 8) | key[3]
112112
return key32 % self.capacity
113113

114-
cdef int _lookup_index(self, uint8_t* key_ptr, int* index_ptr):
114+
cdef int _lookup_index(self, uint8_t* key_ptr, size_t* index_ptr):
115115
"""
116116
search for a specific key.
117117
if found, return 1 and set *index_ptr to the index of the bucket in self.table.
118118
if not found, return 0 and set *index_ptr to the index of a free bucket in self.table.
119119
"""
120-
cdef int index = self._get_index(key_ptr)
120+
cdef size_t index = self._get_index(key_ptr)
121121
cdef uint32_t kv_index
122122
self.stats_lookup += 1
123123
while (kv_index := self.table[index]) != FREE_BUCKET:
@@ -138,7 +138,7 @@ cdef class HashTable:
138138
cdef uint8_t* key_ptr = <uint8_t*> key
139139
cdef uint8_t* value_ptr = <uint8_t*> value
140140
cdef uint32_t kv_index
141-
cdef int index
141+
cdef size_t index
142142
self.stats_set += 1
143143
if self._lookup_index(key_ptr, &index):
144144
kv_index = self.table[index]
@@ -173,7 +173,7 @@ cdef class HashTable:
173173
if len(key) != self.ksize:
174174
raise ValueError("Key size does not match the defined size")
175175
cdef uint32_t kv_index
176-
cdef int index
176+
cdef size_t index
177177
self.stats_get += 1
178178
if self._lookup_index(<uint8_t*> key, &index):
179179
kv_index = self.table[index]
@@ -185,7 +185,7 @@ cdef class HashTable:
185185
if len(key) != self.ksize:
186186
raise ValueError("Key size does not match the defined size")
187187
cdef uint8_t* key_ptr = <uint8_t*> key
188-
cdef int index
188+
cdef size_t index
189189
cdef uint32_t kv_index
190190

191191
self.stats_del += 1
@@ -227,7 +227,7 @@ cdef class HashTable:
227227
return value
228228

229229
def items(self) -> Iterator[tuple[bytes, bytes]]:
230-
cdef int i
230+
cdef size_t i
231231
cdef uint32_t kv_index
232232
self.stats_iter += 1
233233
for i in range(self.capacity):
@@ -237,8 +237,8 @@ cdef class HashTable:
237237
value = self.values[kv_index * self.vsize:(kv_index + 1) * self.vsize]
238238
yield key, value
239239

240-
cdef void _resize_table(self, int new_capacity):
241-
cdef int i, index
240+
cdef void _resize_table(self, size_t new_capacity):
241+
cdef size_t i, index
242242
cdef uint32_t kv_index
243243
cdef uint32_t* new_table = <uint32_t*> malloc(new_capacity * sizeof(uint32_t))
244244
for i in range(new_capacity):
@@ -259,13 +259,13 @@ cdef class HashTable:
259259
self.table = new_table
260260
self.tombstones = 0
261261

262-
cdef void _resize_kv(self, int new_capacity):
262+
cdef void _resize_kv(self, size_t new_capacity):
263263
# We must never use kv indexes >= RESERVED, thus we'll never need more capacity either.
264-
cdef int capacity = min(new_capacity, RESERVED - 1)
264+
cdef size_t capacity = min(new_capacity, <size_t> RESERVED - 1)
265265
self.stats_resize_kv += 1
266266
self.keys = <uint8_t*> realloc(self.keys, capacity * self.ksize * sizeof(uint8_t))
267267
self.values = <uint8_t*> realloc(self.values, capacity * self.vsize * sizeof(uint8_t))
268-
self.kv_capacity = capacity
268+
self.kv_capacity = <uint32_t> capacity
269269

270270
def k_to_idx(self, key: bytes) -> int:
271271
"""
@@ -274,7 +274,7 @@ cdef class HashTable:
274274
"""
275275
if len(key) != self.ksize:
276276
raise ValueError("Key size does not match the defined size")
277-
cdef int index
277+
cdef size_t index
278278
if self._lookup_index(<uint8_t*> key, &index):
279279
return self.table[index] # == uint32_t kv_index
280280
else:
@@ -297,7 +297,7 @@ cdef class HashTable:
297297
raise ValueError("Key size does not match the defined size")
298298
if len(value) != self.vsize:
299299
raise ValueError("Value size does not match the defined size")
300-
cdef int index
300+
cdef size_t index
301301
cdef uint32_t kv_index
302302
if self._lookup_index(<uint8_t*> key, &index):
303303
kv_index = self.table[index]

0 commit comments

Comments
 (0)