CityHash для Python

Буквально вчера компанией Google была выложена библиотека CityHash с набором хеш-функций для строк.
Мне захотелось попробовать поиспользовать CityHash в своих проектах на Python, а так как сейчас начал заниматься Cython'ом, решил быстренько сделать обертку для CityHash на Cython. И сделал. Вдруг кому пригодится, забирайте:

github.com/Amper/cityhash

Для установки: sudo sh ./install.sh
Нужен python>=2.5, cython>=14.x, gcc. Честно говоря, делал на работе на скорую руку, поэтому проверял только на Ubuntu )

P.S. И настолько я разошелся, что вспомнил, что недавно Google выкладывал ещё и Snappy. Хотел и его обернуть для Python, зашел на сайт, а оказывается это уже сделали не только для Python, но и для Haskell, Java, Node.js, Perl и Ruby.
+37
13 апреля 2011, 11:46
20
Amper 73,9 G+

комментарии (9)

0
Volshebnyi #
Оценка качества статьи в тематическом блоге: <рейтинг статьи>/(<количество комментариев>+50)

Спасибо огромное за обертку! Глянул исходники CityHash, после комментария
// Murmur-inspired hashing.
начинается магия =)
+1
seriyPS #
А! Понял чего не хватает! Добавьте хотябы простенький readme и в него минимальный кусок кода как этим пользоваться в Python типа

import cityhash

hash=cityhash.CityHash64("hello world!")


Можно ли им хешировать произвольные потоки данных (файлы скажем). В каком виде получается хеш (hex строка или набор бит)
+1
seriyPS #
Ок, кое что сам попробовал

sudo aptitude install cython
git clone https://github.com/Amper/cityhash.git
cd cityhash/
chmod +x install.sh
sudo ./install.sh
ipython

In [1]: import cityhash

In [2]: cityhash.CityHash64("hello world!")
Out[2]: 9835112831561035123L

In [3]: cityhash.CityHash128("hello world!")
Out[3]: (9012332723877280322L, 15609784913653702318L)

Как работает CityHashWithSeed не понял.
Хешировать потоково (например открытый файл f=open("fname", "r")) пока не понял как.
0
Amper #
+1
Amper #
Хешировать потоково (например открытый файл f=open(«fname», «r»)) пока не понял как.

Хешировать можно только строки ) Например, содержимое файла.

Как работает CityHashWithSeed не понял.

For convenience, a 64-bit seed is also hashed into the result.

Это хэш с начальным значением, то есть вторым параметром ему передается предыдущий хеш.

А! Понял чего не хватает! Добавьте хотябы простенький readme и в него минимальный кусок кода как этим пользоваться в Python типа

Спасибо, чуть позже обязательно добавлю README.
+1
seriyPS #
Т.е. для хеширования файла потоково нужно написать что-то в стиле, грубо говоря

import cityhash
with open("filename", "r") as f:
    chunk=f.read(5120)
    hash=cityhash.CityHash64(chunk)
    chunk=f.read(5120)
    while chunk:
        hash=cityhash.CityHash64WithSeed(chunk, hash)
        chunk=f.read(5120)

assert hash==cityhash.CityHash64(open("filename", "r").read())


Если да, то есть смысл написать обертку в стиле hashlib (с методом update)
+1
seriyPS #
Эта программа падает кстати, говорит
/usr/local/lib/python2.6/dist-packages/cityhash.so in cityhash.CityHash64WithSeed (cityhash.cpp:719)()

OverflowError: long int too large to convert to int
+1
Amper #
Действительно, падает. Спасибо за репорт, поправлено.
+1
Amper #
Т.е. для хеширования файла потоково нужно написать что-то в стиле, грубо говоря

Именно так.

Если да, то есть смысл написать обертку в стиле hashlib (с методом update)

Отличная идея, только вот думаю, подождать пока Google включат в CityHash что-то подобное или написать самому.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.