From 6f9df8db26d76a70f1b3fe7cd7691c34735b9954 Mon Sep 17 00:00:00 2001 From: YishiMichael Date: Tue, 15 Feb 2022 21:38:22 +0800 Subject: [PATCH] Improve hashing algorithm --- manimlib/mobject/svg/svg_mobject.py | 4 ++-- manimlib/utils/iterables.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/manimlib/mobject/svg/svg_mobject.py b/manimlib/mobject/svg/svg_mobject.py index 1534f004..3b8bb6ad 100644 --- a/manimlib/mobject/svg/svg_mobject.py +++ b/manimlib/mobject/svg/svg_mobject.py @@ -17,6 +17,7 @@ from manimlib.mobject.types.vectorized_mobject import VMobject from manimlib.utils.config_ops import digest_config from manimlib.utils.directories import get_mobject_data_dir from manimlib.utils.images import get_full_vector_image_path +from manimlib.utils.iterables import hash_obj from manimlib.logger import log @@ -63,8 +64,7 @@ class SVGMobject(VMobject): self.move_into_position() def init_svg_mobject(self): - hasher = hashlib.sha256(str(self.hash_seed).encode()) - hash_val = hasher.hexdigest() + hash_val = hash_obj(self.hash_seed) if hash_val in SVG_HASH_TO_MOB_MAP: mob = SVG_HASH_TO_MOB_MAP[hash_val].copy() self.add(*mob) diff --git a/manimlib/utils/iterables.py b/manimlib/utils/iterables.py index d94af506..abc96236 100644 --- a/manimlib/utils/iterables.py +++ b/manimlib/utils/iterables.py @@ -139,3 +139,14 @@ def remove_nones(sequence): def concatenate_lists(*list_of_lists): return [item for l in list_of_lists for item in l] + + +def hash_obj(obj): + if isinstance(obj, dict): + new_obj = {k: hash_obj(v) for k, v in obj.items()} + return hash(tuple(frozenset(sorted(new_obj.items())))) + + if isinstance(obj, (set, tuple, list)): + return hash(tuple([hash_obj(e) for e in obj])) + + return hash(obj)