Bug #21437
closedDate#hash may return different values for equal dates with large years
Description
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.
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!
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.
Updated by Stranger6667 (Dmitry Dygalo) about 1 month ago
- Description updated (diff)
Updated by byroot (Jean Boussier) about 1 month ago
- Backport changed from 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN to 3.2: WONTFIX, 3.3: REQUIRED, 3.4: REQUIRED
Updated by Anonymous about 1 month ago
- Status changed from Open to Closed
Applied in changeset git|c1877d431e76f4a782d51602fa8487e98d302956.
[ruby/date] [Bug #21437] Date#hash for large years
Addresses https://bugs.ruby-lang.org/issues/21437
Signed-off-by: Dmitry Dygalo [email protected]
https://github.com/ruby/date/commit/31f07bc576
Updated by nagachika (Tomoyuki Chikanaga) 27 days ago
- Backport changed from 3.2: WONTFIX, 3.3: REQUIRED, 3.4: REQUIRED to 3.2: WONTFIX, 3.3: DONE, 3.4: REQUIRED
ruby_3_3 1fb5ab411f618f651926ecae9427605e03e19884 merged revision(s) c1877d431e76f4a782d51602fa8487e98d302956.
Updated by k0kubun (Takashi Kokubun) 12 days ago
- 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 02744e58f3d410931a58873e1dab8752740e60ff merged revision(s) c1877d431e76f4a782d51602fa8487e98d302956.