From: "k0kubun (Takashi Kokubun) via ruby-core" Date: 2025-07-14T21:33:13+00:00 Subject: [ruby-core:122768] [Ruby Bug#21437] Date#hash may return different values for equal dates with large years Issue #21437 has been updated by k0kubun (Takashi Kokubun). Backport changed from 3.2: WONTFIX, 3.3: DONE, 3.4: REQUIRED to 3.2: WONTFIX, 3.3: DONE, 3.4: DONE ruby_3_4 commit:02744e58f3d410931a58873e1dab8752740e60ff merged revision(s) commit:c1877d431e76f4a782d51602fa8487e98d302956. ---------------------------------------- Bug #21437: Date#hash may return different values for equal dates with large years https://bugs.ruby-lang.org/issues/21437#change-114047 * Author: Stranger6667 (Dmitry Dygalo) * Status: Closed * ruby -v: 3.2.8 - 3.4.4 (and older versions too) * Backport: 3.2: WONTFIX, 3.3: DONE, 3.4: DONE ---------------------------------------- Parsing the same date string allocates new large integer objects with different pointer addresses, which then affects the hash value due to `d_lite_hash` behavior. ```ruby require 'date' # Small year - consistent hashes Date.strptime('2024-5-9', '%Y-%m-%d').hash #=> 3287407234087466140 Date.strptime('2024-5-9', '%Y-%m-%d').hash #=> 3287407234087466140 # BUG - Large year - different hashes for identical date strings Date.strptime('3171505571716611468830131104691-5-9', '%Y-%m-%d').hash #=> 3525034678868094350 Date.strptime('3171505571716611468830131104691-5-9', '%Y-%m-%d').hash #=> 2502076152602341316 # Different hash for same date! ``` In [ext/date/date_core.c](https://github.com/ruby/ruby/blob/v3_4_4/ext/date/date_core.c#L6936): ```c static VALUE d_lite_hash(VALUE self) { st_index_t v, h[4]; get_d1(self); h[0] = m_nth(dat); // Could be different for equal large integers // ... v = rb_memhash(h, sizeof(h)); return ST2FIX(v); } ``` The hash function uses this pointer address directly in `rb_memhash`, so equal dates parsed separately get different hashes. This breaks the hash contract that equal objects must have equal hashes. -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/