From 2026002c216c52b0be849320046013ea98a55c76 Mon Sep 17 00:00:00 2001 From: AlexKnauth Date: Tue, 7 Feb 2023 11:22:17 -0500 Subject: [PATCH] Use hash_code_combine and type-tag in hash_code --- rhombus/data/equality.rhm | 9 +++------ rhombus/tests/equatable.rhm | 8 ++++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/rhombus/data/equality.rhm b/rhombus/data/equality.rhm index e44635883..e429c41aa 100644 --- a/rhombus/data/equality.rhm +++ b/rhombus/data/equality.rhm @@ -9,8 +9,7 @@ import: lib("racket/base.rkt"): meta expose: #{generate-temporaries} - lib("racket/unsafe/ops.rkt").#{unsafe-fx+/wraparound} - lib("racket/unsafe/ops.rkt").#{unsafe-fx*/wraparound} + lib("racket/base.rkt").#{eq-hash-code} class_clause.macro 'equality: $key_expr; ...': @@ -26,10 +25,8 @@ class_clause.macro 'equality: $key_expr; ...': $('&& (recur(this . $key_id(), (other :~ PrivateForEquals) . $key_id()))') ... private override method hash_code(recur): - let code = 1000003 - let code: - #{unsafe-fx+/wraparound}( - #{unsafe-fx*/wraparound}(code, 31), recur(this . $key_id())) + let code = #{eq-hash-code}(PrivateForEquals) + let code: Equatable.hash_code_combine(code, recur(this . $key_id())) ... code' diff --git a/rhombus/tests/equatable.rhm b/rhombus/tests/equatable.rhm index 094ce0036..7b84ef6c1 100644 --- a/rhombus/tests/equatable.rhm +++ b/rhombus/tests/equatable.rhm @@ -24,6 +24,9 @@ class Fail(): class OrderedTriple(fst, snd, thd): equality: fst; snd; thd +class OrderedTriple2(fst, snd, thd): + equality: fst; snd; thd + check AnythingGoes() == AnythingGoes() ~is #true check: use_dynamic @@ -83,6 +86,11 @@ check: OrderedTriple("A", "B", "C").hash_code(fun (_): 0) ~raises "hash_code: no such field or method" +check: OrderedTriple("A", "B", "C") == OrderedTriple2("A", "B", "C") ~is #false +check: hc(OrderedTriple("A", "B", "C")) == hc(OrderedTriple2("A", "B", "C")) + ~is #false +check: {OrderedTriple("A", "B", "C"), OrderedTriple2("A", "B", "C")}.length() ~is 2 + class Foo(a, b, c): equality: a