deal with files < 64k in oshash

This commit is contained in:
j 2009-06-14 21:22:47 +02:00
parent c3c9c49788
commit a2bf2a77d1

View file

@ -20,6 +20,7 @@ def sha1sum(filename):
''' '''
os hash - http://trac.opensubtitles.org/projects/opensubtitles/wiki/HashSourceCodes os hash - http://trac.opensubtitles.org/projects/opensubtitles/wiki/HashSourceCodes
plus modification for files < 64k, buffer is filled with file data and padded with 0
''' '''
def oshash(filename): def oshash(filename):
try: try:
@ -30,24 +31,24 @@ def oshash(filename):
filesize = os.path.getsize(filename) filesize = os.path.getsize(filename)
hash = filesize hash = filesize
if filesize < 65536: if filesize < 65536:
return "SizeError" for x in range(int(filesize/bytesize)):
buffer = f.read(bytesize)
(l_value,)= struct.unpack(longlongformat, buffer)
hash += l_value
hash = hash & 0xFFFFFFFFFFFFFFFF #to remain as 64bit number
else:
for x in range(int(65536/bytesize)): for x in range(int(65536/bytesize)):
buffer = f.read(bytesize) buffer = f.read(bytesize)
(l_value,)= struct.unpack(longlongformat, buffer) (l_value,)= struct.unpack(longlongformat, buffer)
hash += l_value hash += l_value
hash = hash & 0xFFFFFFFFFFFFFFFF #to remain as 64bit number hash = hash & 0xFFFFFFFFFFFFFFFF #to remain as 64bit number
f.seek(max(0,filesize-65536),0) f.seek(max(0,filesize-65536),0)
for x in range(int(65536/bytesize)): for x in range(int(65536/bytesize)):
buffer = f.read(bytesize) buffer = f.read(bytesize)
(l_value,)= struct.unpack(longlongformat, buffer) (l_value,)= struct.unpack(longlongformat, buffer)
hash += l_value hash += l_value
hash = hash & 0xFFFFFFFFFFFFFFFF hash = hash & 0xFFFFFFFFFFFFFFFF
f.close() f.close()
returnedhash = "%016x" % hash returnedhash = "%016x" % hash
return returnedhash return returnedhash