Python Wrapper para Farmhash e Cityhash, uma família de funções de hash não-cristão rápido.
Para instalar a partir de Pypi:
pip install cityhashPara instalar em um ambiente de conda:
conda install -c conda-forge python-cityhash O pacote expõe as APIs do Python para o CityHash e o FarmHash em namespaces cityhash e farmhash , respectivamente. Cada um fornece implementações de 32, 64 e 128 bits.
Exemplo de uso para Farmhash:
> >> from farmhash import FarmHash32 , FarmHash64 , FarmHash128
> >> FarmHash32 ( "abc" )
1961358185
> >> FarmHash64 ( "abc" )
2640714258260161385
> >> FarmHash128 ( "abc" )
76434233956484675513733017140465933893As impressões digitais são hashes sem sementes que garantem que sejam independentes de hardware e plataforma. Isso pode ser útil para aplicativos de rede que requerem valores persistentes de hash.
> >> from farmhash import Fingerprint128
> >> Fingerprint128 ( "abc" )
76434233956484675513733017140465933893CityHash e Farmhash não apóiam o hash incremental e, portanto, não são ideais para hash de fluxos de caráter. Se você precisar de hash incremental, considere outra biblioteca de hash, como Metrohash ou XXHash.
O protocolo buffer permite que os objetos Python exponham seus dados como matrizes de bytes cruas para acesso rápido sem precisar copiar para um local separado na memória. Numpy é uma biblioteca bem conhecida que usa extensivamente esse protocolo.
Todas as funções de hash neste pacote lerão matrizes de bytes de objetos que os expõem através do protocolo buffer. Aqui está um exemplo que mostra um hash de uma matriz Numpy quadridimensional:
> >> import numpy as np
> >> from farmhash import FarmHash64
> >> arr = np . zeros (( 256 , 256 , 4 ))
> >> FarmHash64 ( arr )
1550282412043536862 As matrizes Numpy precisam ser contíguas para que isso funcione. Para converter uma matriz não contígua, use a função ascontiguousarray() da Numpy.
Para plataformas x86-64, o repositório PYPI para este pacote inclui rodas compiladas com suporte ao SSE4.2. As variantes de 32 e 64 bits (mas não as 128 bits) do FarmHash se beneficiam significativamente das instruções SSE4.2.
As funções da CityHash da baunilha (no módulo cityhash ) não aproveitam o SSE4.2. Em vez disso, pode-se usar o módulo cityhashcrc fornecido com este pacote que expõe funções CRC de 128 e 256 bits que aproveitam o SSE4.2. Essas funções são muito rápidas e batem FarmHash128 na velocidade (o FarmHash não inclui uma função de 256 bits). Como o Farmhash é o sucessor pretendido do CityHash, eu teria cuidado antes de usar as funções da CityHash-CRC, e verificaria se elas fornecem aleatoriedade suficiente para a sua aplicação pretendida.
Para aqueles que desejam contribuir, aqui está um começo rápido usando comandos Make:
git clone https://github.com/escherba/python-cityhash.git
cd python-cityhash
make env # create a virtual environment
make test # run Python tests
make cpp-test # run C++ tests
make shell # enter IPython shellPara descobrir quais alvos estão disponíveis, digite:
make helpAs rodas de embalagem são construídas usando o Cibuild Wheel e são distribuídas ao PYPI usando ações do GitHub. As rodas contêm binários compilados e estão disponíveis para as seguintes plataformas: Windows-AMD64, Ubuntu-X86, Linux-X86_64, Linux-Aarch64 e Macosx-X86_64.
Para outras funções rápidas de hash não cristão, disponíveis como extensões Python, consulte Metrohash, Murmurhash e XXHash.
As ligações originais do Cityhash Python são devidas a Alexander [Amper] Marshalov. Eles foram reescritos em Cython por Eugene Scherba, que também adicionou as encadernas de fazenda. Os algoritmos CityHash e Farmhash e sua implementação de C ++ são do Google.
Este software está licenciado sob a licença do MIT. Consulte o arquivo de licença incluído para obter detalhes.