RawValueがIntのenumを何かのインデックスとして使いたい時はhashValueじゃなくてrawValueを使いましょう

そうそう遭遇はしないと思いつつ、Swift 4.2になるとハッシュシードのランダム化により問題が起き得ます。

  • RawValueがIntのenumであっても、rawValueがそのままhashValueではなくなる
    • Swift 4.1までは、rawValue == hashValueという挙動だった(実装依存
  • 実行ごとにハッシュ値は変わる

hashValueは「ダメ。ゼッタイ。

The standard library now uses a high-quality, randomly seeded, universal hash function, represented by the new Hasher struct. Random seeding varies the result of hashValue on each execution of a program, improving the reliability of the standard library's hashed collections, Set and Dictionary. In particular, random seeding enables better protection against (accidental or deliberate) hash-flooding attacks.

https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes/swift_4_2_release_notes_for_xcode_10