Package: cityhash
CityHash/FarmHashPython wrapper forFarmHashandCityHash, a family of fast
non-cryptographic hash functions.Getting StartedTo install from PyPI:pipinstallcityhashTo install in a Conda environment:condainstall-cconda-forgepython-cityhashThe package exposes Python APIs for CityHash and FarmHash undercityhashandfarmhashnamespaces, respectively. Each provides 32-, 64- and 128-bit
implementations.Usage ExamplesStateless hashingUsage example for FarmHash:>>>fromfarmhashimportFarmHash32,FarmHash64,FarmHash128>>>FarmHash32("abc")1961358185>>>FarmHash64("abc")2640714258260161385>>>FarmHash128("abc")76434233956484675513733017140465933893Hardware-independent fingerprintsFingerprints are seedless hashes that are guaranteed to be hardware- and
platform-independent. This can be useful for networking applications which
require persisting hashed values.>>>fromfarmhashimportFingerprint128>>>Fingerprint128("abc")76434233956484675513733017140465933893Incremental hashingCityHash and FarmHash do not support incremental hashing and thus are not ideal
for hashing of character streams. If you require incremental hashing, consider
another hashing library, such asMetroHashorxxHash.Fast hashing of NumPy arraysTheBuffer Protocolallows
Python objects to expose their data as raw byte arrays for fast access without
having to copy to a separate location in memory. NumPy is one well-known
library that extensively uses this protocol.All hashing functions in this package will read byte arrays from objects that
expose them via the buffer protocol. Here is an example showing hashing of a
four-dimensional NumPy array:>>>importnumpyasnp>>>fromfarmhashimportFarmHash64>>>arr=np.zeros((256,256,4))>>>FarmHash64(arr)1550282412043536862The NumPy arrays need to be contiguous for this to work. To convert a
non-contiguous array, use NumPy'sascontiguousarray()function.SSE4.2 supportFor x86-64 platforms, the PyPI repository for this package includes wheels
compiled with SSE4.2 support.  The 32- and 64-bit (but not the 128-bit)
variants of FarmHash significantly benefit from SSE4.2 instructions.The vanilla CityHash functions (undercityhashmodule) do not take advantage
of SSE4.2. Instead, one can use thecityhashcrcmodule provided with this
package which exposes 128- and 256-bit CRC functions that do harness SSE4.2.
These functions are very fast, and beatFarmHash128on speed (FarmHash does
not include a 256-bit function). Since FarmHash is the intended successor of
CityHash, I would be careful before using the CityHash-CRC functions, however,
and would verify whether they provide sufficient randomness for your intended
application.DevelopmentLocal workflowFor those wanting to contribute, here is a quick start using Make commands:gitclonehttps://github.com/escherba/python-cityhash.gitcdpython-cityhash
makeenv# create a virtual environmentmaketest# run Python testsmakecpp-test# run C++ testsmakeshell# enter IPython shellTo find out which Make targets are available, enter:makehelpDistributionThe package wheels are built usingcibuildwheeland are distributed to
PyPI using GitHub actions. The wheels contain compiled binaries and are
available for the following platforms: windows-amd64, ubuntu-x86,
linux-x86_64, linux-aarch64, and macosx-x86_64.See AlsoFor other fast non-cryptographic hash functions available as Python extensions,
seeMetroHash,MurmurHash, andxxHash.AuthorsThe original CityHash Python bindings are due to Alexander [Amper] Marshalov.
They were rewritten in Cython by Eugene Scherba, who also added the FarmHash
bindings. The CityHash and FarmHash algorithms and their C++ implementation are
by Google.LicenseThis software is licensed under theMIT
License. See the included
LICENSE file for details.