Commit 45e3ba4a authored by Bastien Montagne's avatar Bastien Montagne
Browse files add BlendFileBlock.get_data_hash() 'pointer-invariant' hash generator.

This aims at giving some kind of uid to replace addr_old, that does not changes on
every .blend saving.
parent d5fd57ff
......@@ -433,6 +433,23 @@ class BlendFileBlock:
for k in self.keys():
yield from self.get_recursive_iter(k, use_str=False)
def get_data_hash(self):
Generates a 'hash' that can be used instead of addr_old as block id, and that should be 'stable' across .blend
file load & save (i.e. it does not changes due to pointer addresses variations).
# TODO This implementation is most likely far from optimal... and CRC32 is not renown as the best hashing
# algo either. But for now does the job!
import zlib
def _is_pointer(self, k):
return self.file.structs[self.sdna_index].field_from_path(self.file.header, self.file.handle, k).dna_name.is_pointer
hsh = 1
for k, v in self.items_recursive_iter():
if not _is_pointer(self, k):
hsh = zlib.adler32(str(v).encode(), hsh)
return hsh
def set(self, path, value,
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment