From 7546ab8654426e63ebf798d152e0f20701a7855c Mon Sep 17 00:00:00 2001 From: Matthias Diener Date: Tue, 3 Sep 2024 09:16:12 -0500 Subject: [PATCH 1/3] KeyBuilder: change int to direct str representation --- pytools/persistent_dict.py | 11 +---------- pytools/test/test_persistent_dict.py | 10 +++++++--- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/pytools/persistent_dict.py b/pytools/persistent_dict.py index 3f89887f..2fca2dcf 100644 --- a/pytools/persistent_dict.py +++ b/pytools/persistent_dict.py @@ -283,16 +283,7 @@ def update_for_type(key_hash: Hash, key: type) -> None: @staticmethod def update_for_int(key_hash: Hash, key: int) -> None: - sz = 8 - while True: - try: - # Must match system byte order so that numpy and this - # generate the same string of bytes. - # https://github.com/inducer/pytools/issues/259 - key_hash.update(key.to_bytes(sz, byteorder=sys.byteorder, signed=True)) - return - except OverflowError: - sz *= 2 + key_hash.update(str(key).encode("utf-8")) @classmethod def update_for_enum(cls, key_hash: Hash, key: Enum) -> None: diff --git a/pytools/test/test_persistent_dict.py b/pytools/test/test_persistent_dict.py index b04d43a0..a7e43e51 100644 --- a/pytools/test/test_persistent_dict.py +++ b/pytools/test/test_persistent_dict.py @@ -432,9 +432,13 @@ def test_scalar_hashing() -> None: assert keyb(np.int32(1)) == keyb(np.int32(1)) assert keyb(np.int32(2)) != keyb(np.int32(1)) assert keyb(np.int64(1)) == keyb(np.int64(1)) - assert keyb(1) == keyb(np.int64(1)) + assert keyb(1) != keyb(np.int64(1)) assert keyb(1) != keyb(np.int32(1)) + assert keyb(1) == keyb("1") + assert keyb(1.0) != keyb("1.0") # '1.0' uses hex representation + assert keyb(1+1j) == keyb("(1+1j)") + assert keyb(np.longlong(1)) == keyb(np.longlong(1)) assert keyb(np.float16(1.1)) == keyb(np.float16(1.1)) @@ -566,7 +570,7 @@ class MyDC: name: str value: int - assert keyb(MyDC("hi", 1)) == "d1a1079f1c10aa4f" + assert keyb(MyDC("hi", 1)) == "72c25f5d0ac2bda7" assert keyb(MyDC("hi", 1)) == keyb(MyDC("hi", 1)) assert keyb(MyDC("hi", 1)) != keyb(MyDC("hi", 2)) @@ -590,7 +594,7 @@ class MyAttrs: name: str value: int - assert (keyb(MyAttrs("hi", 1)) == "5b6c5da60eb2bd0f") # type: ignore[call-arg] + assert (keyb(MyAttrs("hi", 1)) == "6e8bfc4394f82985") # type: ignore[call-arg] assert keyb(MyAttrs("hi", 1)) == keyb(MyAttrs("hi", 1)) # type: ignore[call-arg] assert keyb(MyAttrs("hi", 1)) != keyb(MyAttrs("hi", 2)) # type: ignore[call-arg] From c93f32523cc3285d292525b95b060742b02eafae Mon Sep 17 00:00:00 2001 From: Matthias Diener Date: Fri, 4 Oct 2024 14:46:35 -0500 Subject: [PATCH 2/3] clarify relations between numpy/python scalars --- pytools/test/test_persistent_dict.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pytools/test/test_persistent_dict.py b/pytools/test/test_persistent_dict.py index a7e43e51..3e4323d5 100644 --- a/pytools/test/test_persistent_dict.py +++ b/pytools/test/test_persistent_dict.py @@ -439,6 +439,9 @@ def test_scalar_hashing() -> None: assert keyb(1.0) != keyb("1.0") # '1.0' uses hex representation assert keyb(1+1j) == keyb("(1+1j)") + assert keyb(np.float64(1.0)) != keyb(1.0) + assert keyb(np.complex128(1.0+2.0j)) != keyb(1.0+2.0j) + assert keyb(np.longlong(1)) == keyb(np.longlong(1)) assert keyb(np.float16(1.1)) == keyb(np.float16(1.1)) From 20fe54ef6f9b30f5449265dd33eacc2c1deda130 Mon Sep 17 00:00:00 2001 From: Matthias Diener Date: Fri, 4 Oct 2024 14:48:03 -0500 Subject: [PATCH 3/3] remove now incorrect note --- pytools/persistent_dict.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pytools/persistent_dict.py b/pytools/persistent_dict.py index 2fca2dcf..f0fbd4dd 100644 --- a/pytools/persistent_dict.py +++ b/pytools/persistent_dict.py @@ -174,12 +174,6 @@ class KeyBuilder: may stop working as early as 2022. .. versionadded:: 2021.2 - - .. note:: - - Some key-building uses system byte order, so the built keys may not match - across different systems. It would be desirable to fix this, but this is - not yet done. """ # this exists so that we can (conceivably) switch algorithms at some point