Python Wrapper für Farmhash und Cityhash, eine Familie schnell nicht kryptografischer Hash-Funktionen.
Von PYPI zu installieren:
pip install cityhashIn einer Conda -Umgebung zu installieren:
conda install -c conda-forge python-cityhash Das Paket enthüllt Python APIs für Cityhash und Farmhash unter cityhash und farmhash -Namespaces. Jeder bietet 32-, 64- und 128-Bit-Implementierungen.
Nutzungsbeispiel für FarmHash:
> >> from farmhash import FarmHash32 , FarmHash64 , FarmHash128
> >> FarmHash32 ( "abc" )
1961358185
> >> FarmHash64 ( "abc" )
2640714258260161385
> >> FarmHash128 ( "abc" )
76434233956484675513733017140465933893Fingerabdrücke sind kernlose Hashes, die garantiert hardware und plattformunabhängig sind. Dies kann für Netzwerkanwendungen nützlich sein, die anhaltende Hash -Werte erfordern.
> >> from farmhash import Fingerprint128
> >> Fingerprint128 ( "abc" )
76434233956484675513733017140465933893Cityhash und Farmhash unterstützen nicht inkrementelles Hashing und sind daher nicht ideal für die Hase von Charakterströmen. Wenn Sie inkrementelles Hashing benötigen, sollten Sie eine andere Hashing -Bibliothek wie MetroHash oder XXHASH in Betracht ziehen.
Mit dem Pufferprotokoll können Python -Objekte ihre Daten als Roh -Byte -Arrays für einen schnellen Zugriff freilegen, ohne an einen separaten Speicherort im Speicher zu kopieren. Numpy ist eine bekannte Bibliothek, die dieses Protokoll ausgiebig verwendet.
Alle Hashing -Funktionen in diesem Paket lesen Byte -Arrays von Objekten, die sie über das Pufferprotokoll freilegen. Hier ist ein Beispiel, das ein vierdimensionales Numpy-Array zeigt:
> >> import numpy as np
> >> from farmhash import FarmHash64
> >> arr = np . zeros (( 256 , 256 , 4 ))
> >> FarmHash64 ( arr )
1550282412043536862 Die Numpy -Arrays müssen angrenzend sein, damit dies funktioniert. Verwenden Sie zur Konvertierung eines nicht kontinuierlichen Arrays von Numpy's ascontiguousarray() .
Für X86-64-Plattformen enthält das PYPI-Repository für dieses Paket Räder, die mit SSE4.2-Unterstützung zusammengestellt wurden. Die 32- und 64-Bit-Varianten von Farmhash (aber nicht die 128-Bit) -Varianten profitieren erheblich von SSE4.2-Anweisungen.
Die Vanilla Cityhash -Funktionen (unter cityhash -Modul) nutzen SSE4.2 nicht. Stattdessen kann man das cityhashcrc -Modul verwenden, das mit diesem Paket versehen ist, das 128- und 256-Bit-CRC-Funktionen enthüllt, die SSE4.2 nutzen. Diese Funktionen sind sehr schnell und schlagen FarmHash128 auf Geschwindigkeit (Farmhash beinhaltet keine 256-Bit-Funktion). Da Farmhash der beabsichtigte Nachfolger von Cityhash ist, würde ich jedoch vorsichtig sein, bevor ich die Cityhash-CRC-Funktionen nutze, und ob sie überprüft, ob sie für Ihre beabsichtigte Anwendung ausreichende Zufälligkeit bieten.
Für diejenigen, die einen Beitrag leisten möchten, starten Sie hier einen kurzen Start mit Make -Befehlen:
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 shellUm herauszufinden, welche Ziele verfügbar sind, geben Sie ein:
make helpDie Paketräder werden mit CibuildWheel erstellt und unter Verwendung von Github -Aktionen an PYPI verteilt. Die Räder enthalten kompilierte Binärdateien und sind für die folgenden Plattformen verfügbar: Windows-AMD64, Ubuntu-X86, Linux-X86_64, Linux-Aarch64 und MacOSX-X86_64.
Für andere schnelle nicht kryptografische Hash-Funktionen, die als Python-Erweiterungen verfügbar sind, siehe Metrohash, Murmurhash und XXHASH.
Die ursprünglichen Cityhash -Python -Bindungen sind auf Alexander [Amper] Marschhalov zurückzuführen. Sie wurden von Eugene Scherba in Cython umgeschrieben, der auch die FarmHash -Bindungen hinzufügte. Die Cityhash- und Farmhash -Algorithmen und ihre C ++ - Implementierung sind von Google.
Diese Software ist unter der MIT -Lizenz lizenziert. Weitere Informationen finden Sie in der mitgelieferten Lizenzdatei.