CityHash
ClickHouse は Google 製 CityHash の 以前のバージョンの 1 つを使用しています。
参考文献
CityHash は、ClickHouse に組み込んだ後でアルゴリズムが変更されました。
CityHash のドキュメントでは、ユーザーは特定のハッシュ値に依存すべきではなく、それをどこかに保存したり、シャーディングキーとして使用したりすべきではないと明記されています。
しかし、この関数をユーザーに公開したため、CityHash のバージョン(1.0.2)を固定せざるを得ませんでした。現在、SQL で利用可能な CityHash 関数の挙動は変わらないことを保証しています。
— Alexey Milovidov
注意
現在の Google 製 CityHash のバージョンは、ClickHouse の cityHash64 バリアントとは異なります。
Google 製 CityHash の値を得るために farmHash64 を使用しないでください。FarmHash は CityHash の後継ですが、完全な互換性はありません。
| String | ClickHouse64 | CityHash64 | FarmHash64 |
|---|---|---|---|
Moscow | 12507901496292878638 | 5992710078453357409 | 5992710078453357409 |
How can you write a big system without C++? -Paul Glick | 6237945311650045625 | 749291162957442504 | 11716470977470720228 |
また、CityHash の説明と作成の背景については Introducing CityHash も参照してください。要するに、暗号用途を想定していないハッシュであり、MurmurHash より高速ですが、より複雑です。
実装
Go
両方のバリアントに対応している Go パッケージ go-faster/city を利用できます。