Improve transformation hashing algorithm.

This commit is contained in:
Roberto Rosario
2016-11-16 19:11:55 -04:00
parent 4578eacce9
commit ba11e63364
2 changed files with 24 additions and 6 deletions

View File

@@ -233,11 +233,11 @@ class BaseTransformation(object):
def combine(transformations):
result = None
for transformation in transformations:
for index, transformation in enumerate(transformations):
if not result:
result = BaseTransformation.decode_hash(transformation.cache_hash())
result = hash((BaseTransformation.decode_hash(transformation.cache_hash()), index))
else:
result ^= BaseTransformation.decode_hash(transformation.cache_hash())
result ^= hash((BaseTransformation.decode_hash(transformation.cache_hash()), index))
return BaseTransformation.encode_hash(result)
@@ -267,8 +267,8 @@ class BaseTransformation(object):
def cache_hash(self):
result = unicode.__hash__(self.name)
for key, value in self.kwargs.items():
result ^= unicode.__hash__(key) ^ str.__hash__(str(value))
for index, (key, value) in enumerate(self.kwargs.items()):
result ^= hash((key, index)) ^ hash((value, index))
return BaseTransformation.encode_hash(result)
@@ -314,7 +314,7 @@ class TransformationRotate(BaseTransformation):
self.degrees %= 360
if self.degress == 0:
if self.degrees == 0:
return self.image
return self.image.rotate(

View File

@@ -21,6 +21,24 @@ TRANSFORMATION_ZOOM_CACHE_HASH = '47840c3658dc399a'
class TransformationTestCase(TestCase):
def test_cache_uniqness(self):
transformation_1 = TransformationResize(width=640, height=640)
transformation_2 = TransformationResize(width=800, height=800)
self.assertNotEqual(
transformation_1.cache_hash(), transformation_2.cache_hash()
)
def test_cache_combining_uniqness(self):
transformation_1 = TransformationZoom(percent=100)
transformation_2 = TransformationResize(width=800, height=800)
self.assertNotEqual(
BaseTransformation.combine((transformation_1, transformation_2)),
BaseTransformation.combine((transformation_2, transformation_1)),
)
def test_resize_cache_hashing(self):
# Test if the hash is being generated correctly
transformation = TransformationResize(