Untitled
unknown
python
2 years ago
1.6 kB
14
Indexable
import array
with open('hashes.bin','rb') as hf:
filebuf = hf.read()
num_hashes = len(filebuf)//16
indx = array.array('L', range(num_hashes))
def hash_comp_val(p, v):
if filebuf[indx[p]*16:(indx[p]+1)*16] < v:
return -1
elif filebuf[indx[p]*16:(indx[p]+1)*16] > v:
return 1
return 0
def hash_comp_hash(p, q):
if filebuf[indx[p]*16:(indx[p]+1)*16] < filebuf[indx[q]*16:(indx[q]+1)*16]:
return -1
elif filebuf[indx[p]*16:(indx[p]+1)*16] > filebuf[indx[q]*16:(indx[q]+1)*16]:
return 1
return 0
def hash_swap(x, y):
temp = indx[x]
indx[x] = indx[y]
indx[y] = temp
def simplesort(lo, hi):
for i in range(hi-lo, 0, -1):
for j in range(lo, lo+i):
if hash_comp_hash(j, j+1) == 1:
hash_swap(j, j+1)
def somesort(lo, hi):
if lo <= (hi - 8):
mid = (lo+hi)//2
mid_val = filebuf[indx[mid]*16:(indx[mid]+1)*16]
lt = lo
ct = lo
rt = hi
while ct <= rt:
if hash_comp_val(ct, mid_val) > 0:
hash_swap(ct, rt)
rt -= 1
elif hash_comp_val(ct, mid_val) < 0:
hash_swap(ct, lt)
lt += 1
ct += 1
else:
ct += 1
# print (lo, lt, ct, rt, hi)
somesort(lo, lt-1)
somesort(rt+1, hi)
return
elif lo < hi:
simplesort(lo, hi)
return
somesort(0, num_hashes-1)
with open('hashes_s.bin','wb') as shf:
for i in range(num_hashes):
shf.write(filebuf[indx[i]*16:(indx[i]+1)*16])Editor is loading...
Leave a Comment