Pythonの裏知識:infのhash値は円周率になっている

redditから拾ってきたネタだよ。独自性もクソもないね(ヘラヘラ)

www.reddit.com

Pythonで無限大を表す値を得るにはfloat()を使えばよいことが知られている。

>>> float('inf')
inf

infhash()を取ると、円周率を表す値になっていることが確認できる。

>>> hash(float('inf'))
314159

ちなみにこれは3.xの処理系での話。バージョン2.7では自然対数の底を表す271828となっている。

以上。

なんでだろう

CPythonのpyhash.hの29行目に次のような定義が確認できる。

cpython/pyhash.h at 631fdee6e61b4ba8ce800f827fecdd536bfb04f3 · python/cpython · GitHub

#define _PyHASH_INF 314159 

意図的なもののようだ。

この定義は_Py_HashDoubleという数値のHash値を返す関数で使われている。

cpython/pyhash.c at f432a3234f9f2ee09bd40be03e06bf72865ee375 · python/cpython · GitHub

    if (!Py_IS_FINITE(v)) {
        if (Py_IS_INFINITY(v))
            return v > 0 ? _PyHASH_INF : -_PyHASH_INF;
        else
            return _PyHASH_NAN;
    }

当たり前だが特別扱いの処理が確認できた。Pythonすごいなと思った(何が)