Stir the hash value more with encoding index

This commit is contained in:
Nobuyoshi Nakada 2023-12-17 00:30:00 +09:00
parent 2f595c744e
commit ab7f54688b
No known key found for this signature in database
GPG Key ID: 3582D74E1FEE4465
2 changed files with 6 additions and 3 deletions

View File

@ -3586,11 +3586,12 @@ rb_str_prepend_multi(int argc, VALUE *argv, VALUE str)
st_index_t st_index_t
rb_str_hash(VALUE str) rb_str_hash(VALUE str)
{ {
st_index_t h = rb_memhash((const void *)RSTRING_PTR(str), RSTRING_LEN(str));
int e = RSTRING_LEN(str) ? ENCODING_GET(str) : 0; int e = RSTRING_LEN(str) ? ENCODING_GET(str) : 0;
if (e && is_ascii_string(str)) { if (e && !is_ascii_string(str)) {
e = 0; h = rb_hash_end(rb_hash_uint32(h, (uint32_t)e));
} }
return rb_memhash((const void *)RSTRING_PTR(str), RSTRING_LEN(str)) ^ e; return h;
} }
int int

View File

@ -1345,6 +1345,8 @@ CODE
bug9172 = '[ruby-core:58658] [Bug #9172]' bug9172 = '[ruby-core:58658] [Bug #9172]'
assert_not_equal(S("sub-setter").hash, S("discover").hash, bug9172) assert_not_equal(S("sub-setter").hash, S("discover").hash, bug9172)
assert_equal(S("").hash, S("".encode(Encoding::UTF_32BE)).hash) assert_equal(S("").hash, S("".encode(Encoding::UTF_32BE)).hash)
h1, h2 = ["\x80", "\x81"].map {|c| c.b.hash ^ c.hash}
assert_not_equal(h1, h2)
end end
def test_hex def test_hex