Python 3.11 からデフォルトの文字列ハッシュアルゴリズムが SipHash13 になります

Pythonの文字列やバイト列に対するハッシュアルゴリズムは、HashDoS対策としてPython 3.4から SipHash24が使われていました。

その後、ラウンド数を減らしたSipHash13でも十分に安全だとして2015年にRustが、2016年にRubyが、SipHash24からSipHash13への切り替えを行いました。

Python でもSipHash13に切り替えようという提案を2017年に行っていたのですが、実装した人がなかなかプルリクエストを作ってくれず、またPythonは文字列がimmutableでハッシュ値をキャッシュしているためにそこまで大きなインパクトがなかったこともあり、ずっと放置されていました。

Issue 29410: Moving to SipHash-1-3 - Python tracker

しかし、Python の高速化プロジェクト Faster CPython で、セキュリティをある程度犠牲にしても高速なハッシュアルゴリズムを使うことで起動速度を上げられないかという話題が持ち上がり、まずは SipHash13 の切り替えを前に進めることにしました。

Faster hash function · Issue #88 · faster-cpython/ideas · GitHub

ということで、 Rust や Ruby からは数年遅れましたが、Pythonもデフォルトの文字列ハッシュアルゴリズムがSipHash13に切り替わりました。

他のハッシュアルゴリズムを使いたいときは、 configure のオプションの --with-hash-algorithm=[fnv|siphash13|siphash24] で切り替えることができます。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。