From 47047a231f1f0fcfc3b7597a9e2d6d61ae451647 Mon Sep 17 00:00:00 2001 From: Jacob Henner Date: Tue, 14 May 2024 16:37:31 -0400 Subject: [PATCH] fix: use deterministic comparison ordering _compare_dicts exhibited non-deterministic ordering due to hash randomization affecting the ordering of sets used to compare dict keys. Dict key comparisons are now performed without sets, resulting in dict key ordering being preserved. --- jsonpatch.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/jsonpatch.py b/jsonpatch.py index d3fc26d..e59de28 100644 --- a/jsonpatch.py +++ b/jsonpatch.py @@ -859,10 +859,9 @@ def _item_replaced(self, path, key, item): }, pointer_cls=self.pointer_cls)) def _compare_dicts(self, path, src, dst): - src_keys = set(src.keys()) - dst_keys = set(dst.keys()) - added_keys = dst_keys - src_keys - removed_keys = src_keys - dst_keys + added_keys = [key for key in dst.keys() if key not in src.keys()] + removed_keys = [key for key in src.keys() if key not in dst.keys()] + intersection = [key for key in src.keys() if key in dst.keys()] for key in removed_keys: self._item_removed(path, str(key), src[key]) @@ -870,7 +869,7 @@ def _compare_dicts(self, path, src, dst): for key in added_keys: self._item_added(path, str(key), dst[key]) - for key in src_keys & dst_keys: + for key in intersection: self._compare_values(path, key, src[key], dst[key]) def _compare_lists(self, path, src, dst):