mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-01 09:24:10 +01:00
uavo hash: ensure that uavo hash is stable across OSes
In python, os.walk() is not sorted. This can result in the hash being computed over the files in different orders on different OSes, or even after touching a directory. This ensures that the files are considered in lexical order so that the hash is stable.
This commit is contained in:
parent
0d30138571
commit
6b2d1e3d6f
@ -258,6 +258,11 @@ def GetHashofDirs(directory, verbose=0):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
for root, dirs, files in os.walk(directory):
|
for root, dirs, files in os.walk(directory):
|
||||||
|
# os.walk() is unsorted. Must make sure we process files in sorted order so
|
||||||
|
# that the hash is stable across invocations and across OSes.
|
||||||
|
if files:
|
||||||
|
files.sort()
|
||||||
|
|
||||||
for names in files:
|
for names in files:
|
||||||
if verbose == 1:
|
if verbose == 1:
|
||||||
print 'Hashing', names
|
print 'Hashing', names
|
||||||
@ -269,18 +274,30 @@ def GetHashofDirs(directory, verbose=0):
|
|||||||
f1.close()
|
f1.close()
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# Compute file hash. Same as running "sha1sum <file>".
|
||||||
|
f1hash = hashlib.sha1()
|
||||||
while 1:
|
while 1:
|
||||||
# Read file in as little chunks
|
# Read file in as little chunks
|
||||||
buf = f1.read(4096)
|
buf = f1.read(4096)
|
||||||
if not buf : break
|
if not buf : break
|
||||||
SHAhash.update(hashlib.sha1(buf).hexdigest())
|
f1hash.update(buf)
|
||||||
f1.close()
|
f1.close()
|
||||||
|
|
||||||
|
if verbose == 1:
|
||||||
|
print 'Hash is', f1hash.hexdigest()
|
||||||
|
|
||||||
|
# Append the hex representation of the current file's hash into the cumulative hash
|
||||||
|
SHAhash.update(f1hash.hexdigest())
|
||||||
|
|
||||||
except:
|
except:
|
||||||
import traceback
|
import traceback
|
||||||
# Print the stack traceback
|
# Print the stack traceback
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
return -2
|
return -2
|
||||||
|
|
||||||
|
if verbose == 1:
|
||||||
|
print 'Final hash is', SHAhash.hexdigest()
|
||||||
|
|
||||||
hex_stream = lambda s:",".join(['0x'+hex(ord(c))[2:].zfill(2) for c in s])
|
hex_stream = lambda s:",".join(['0x'+hex(ord(c))[2:].zfill(2) for c in s])
|
||||||
return hex_stream(SHAhash.digest())
|
return hex_stream(SHAhash.digest())
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user