From d51feec98d7b4e4b224c34c013da6df059b78005 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Thu, 21 Jul 2022 23:16:56 -0400 Subject: cache key generation using params, path, color, and style --- lib/utils/cache.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'lib/utils/cache.py') diff --git a/lib/utils/cache.py b/lib/utils/cache.py index 46d8ec59..767978ca 100644 --- a/lib/utils/cache.py +++ b/lib/utils/cache.py @@ -4,6 +4,8 @@ # Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details. import os import atexit +import hashlib +import pickle import appdirs import diskcache @@ -31,3 +33,38 @@ def get_stitch_plan_cache(): atexit.register(__stitch_plan_cache.close) return __stitch_plan_cache + + +class CacheKeyGenerator(object): + """Generate cache keys given arbitrary data. + + Given arbitrary data, generate short cache key that is extremely likely + to be unique. + + Use example: + + >>> generator = CacheKeyGenerator() + >>> generator.update(b'12345') + >>> generator.update([1, 2, 3, {4, 5, 6}]) + >>> generator.get_cache_key() + """ + + def __init__(self): + # SHA1 is chosen for speed. We don't need cryptography-grade hashing + # for this use case. + self._hasher = hashlib.sha1() + + def update(self, data): + """Provide data to be hashed into a cache key. + + Arguments: + data -- a bytes object or any object that can be pickled + """ + + if not isinstance(data, bytes): + data = pickle.dumps(data) + + self._hasher.update(data) + + def get_cache_key(self): + return self._hasher.hexdigest() -- cgit v1.2.3