Emballage Python pour Farmhash et Cityhash, une famille de fonctions de hachage rapides non cryptographiques.
Pour installer à partir de PYPI:
pip install cityhashPour installer dans un environnement conda:
conda install -c conda-forge python-cityhash Le package expose les API Python pour Cityhash et Farmhash sous cityhash et les espaces de noms farmhash , respectivement. Chacun fournit des implémentations 32, 64 et 128 bits.
Exemple d'utilisation pour Farmhash:
> >> from farmhash import FarmHash32 , FarmHash64 , FarmHash128
> >> FarmHash32 ( "abc" )
1961358185
> >> FarmHash64 ( "abc" )
2640714258260161385
> >> FarmHash128 ( "abc" )
76434233956484675513733017140465933893Les empreintes digitales sont des hachages sans pépins qui sont garantis d'être indépendants du matériel et de la plate-forme. Cela peut être utile pour les applications de réseautage qui nécessitent des valeurs hachés persistantes.
> >> from farmhash import Fingerprint128
> >> Fingerprint128 ( "abc" )
76434233956484675513733017140465933893Cityhash et Farmhash ne soutiennent pas le hachage incrémentiel et ne sont donc pas idéaux pour le hachage des flux de caractère. Si vous avez besoin de hachage incrémentiel, considérez une autre bibliothèque de hachage, comme Metrohash ou XXHASH.
Le protocole de tampon permet aux objets Python d'exposer leurs données sous forme de tableaux d'octets bruts pour un accès rapide sans avoir à copier dans un emplacement séparé en mémoire. Numpy est une bibliothèque bien connue qui utilise largement ce protocole.
Toutes les fonctions de hachage de ce package liront les tableaux d'octets à partir d'objets qui les exposent via le protocole de tampon. Voici un exemple montrant le hachage d'un tableau Numpy à quatre dimensions:
> >> import numpy as np
> >> from farmhash import FarmHash64
> >> arr = np . zeros (( 256 , 256 , 4 ))
> >> FarmHash64 ( arr )
1550282412043536862 Les tableaux Numpy doivent être contigus pour que cela fonctionne. Pour convertir un tableau non continu, utilisez la fonction ascontiguousarray() de Numpy.
Pour les plates-formes x86-64, le référentiel PYPI de ce package comprend des roues compilées avec la prise en charge SSE4.2. Les variantes de 32 et 64 bits (mais pas des 128 bits) de Farmhash bénéficient considérablement des instructions SSE4.2.
Les fonctions Vanilla Cityhash (sous le module cityhash ) ne profitent pas de SSE4.2. Au lieu de cela, on peut utiliser le module cityhashcrc fourni avec ce package qui expose les fonctions CRC 128 et 256 bits qui harnais SSE4.2. Ces fonctions sont très rapides et battent FarmHash128 à la vitesse (Farmhash n'inclut pas de fonction 256 bits). Étant donné que Farmhash est le successeur prévu de Cityhash, je ferais attention avant d'utiliser les fonctions Cityhash-CRC, et je vérifierais s'ils fournissent suffisamment d'aléatoire pour votre application prévue.
Pour ceux qui souhaitent contribuer, voici un démarrage rapide à l'aide de commandes de 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 shellPour savoir quelles cibles sont disponibles, entrez: entrez:
make helpLes roues d'emballage sont construites à l'aide de Cibuildwheel et sont distribuées à PYPI à l'aide d'actions GitHub. Les roues contiennent des binaires compilés et sont disponibles pour les plates-formes suivantes: Windows-AMD64, Ubuntu-X86, Linux-X86_64, Linux-Aarch64 et MacOSX-X86_64.
Pour d'autres fonctions de hachage rapides non cryptographiques disponibles sous forme d'extensions de python, voir Metrohash, Murmurhash et XXHASH.
Les reliures originales de Cityhash Python sont dues à Alexander [Amper] Marshalov. Ils ont été réécrits dans Cython par Eugene Scherba, qui a également ajouté les reliures Farmhash. Les algorithmes Cityhash et Farmhash et leur implémentation C ++ sont de Google.
Ce logiciel est concédé sous licence MIT. Voir le fichier de licence inclus pour plus de détails.