CityHash
ClickHouse использует одну из предыдущих версий CityHash от Google.
В CityHash изменился алгоритм после того, как мы добавили его в ClickHouse.
В документации CityHash прямо указано, что пользователю не следует полагаться на конкретные хеш-значения и не следует где-либо их сохранять или использовать в качестве ключа шардирования.
Но поскольку мы предоставили эту функцию пользователю, нам пришлось зафиксировать версию CityHash (на 1.0.2). И теперь мы гарантируем, что поведение функций CityHash, доступных в SQL, не изменится.
— Алексей Миловидов
Текущая версия CityHash от Google отличается от варианта ClickHouse cityHash64.
Не используйте farmHash64, чтобы получить значение CityHash от Google! FarmHash является преемником CityHash, но они не полностью совместимы.
| Строка | ClickHouse64 | CityHash64 | FarmHash64 |
|---|---|---|---|
Moscow | 12507901496292878638 | 5992710078453357409 | 5992710078453357409 |
How can you write a big system without C++? -Paul Glick | 6237945311650045625 | 749291162957442504 | 11716470977470720228 |
См. также Introducing CityHash для описания и обоснования его создания. TL;DR: некриптографическая хеш-функция, которая работает быстрее, чем MurmurHash, но при этом более сложная.
Реализации
Go
Вы можете использовать пакет Go go-faster/city, который реализует оба варианта.