🐈

[Bug #20880] Hash のキーを破壊的に変更するとキーが重複するバグ報告

2024/10/29に公開

[Bug #20880] Hash allows array-type key duplicates

  • 次のような書き方をしたときに Hash のキーが重複するというバグ報告
# Array をキーとして Hash に値を割り当てる
ary = [1, 2]
hash = { ary => "hoge" }

pp hash
# => {[1, 2]=>"hoge"}


# ary の値を書き換えた上でそれをキーとして値を割り当てる
ary << 3
hash[ary] = "foo"

# [1, 2, 3] のキーが2つある
pp hash
# => {[1, 2, 3]=>"hoge", [1, 2, 3]=>"foo"}
  • これなんですが意図する挙動になっておりキーのハッシュ値が変わってしまった場合には正しく値を取得することができなくなるからです
ary = []

# この時点でのハッシュ値をキーとする
pp ary.hash   # => -1318494078152444009
hash = { ary => 1 }

# 破壊的な変更があるとハッシュ値も変わってしまうので hash から値を取り出せなくなる
ary << 1
pp ary.hash    # => -433313666350349196
pp hash[ary]   # => nil
ary = []

hash = { ary => 1 }

ary << 1

# rehash したあとであればキーが破壊的に変更されたあとでも正しく参照できる
hash.rehash
pp hash[ary]   # => 1
GitHubで編集を提案

Discussion