Signatur
Beschreibung
Der Hamming-Abstand zweier ganzer Zahlen ist die Anzahl der Stellen (Bits), in denen sich ihre binären Darstellungen unterscheiden. gmp_hamdist berechnet diesen Wert für zwei beliebig große ganze Zahlen mithilfe der GMP-Bibliothek (GNU Multiple Precision).
Intern wird ein bitweises XOR der beiden Zahlen berechnet und anschließend die Anzahl der gesetzten Bits (Population Count) im Ergebnis ermittelt. Die Funktion ist besonders nützlich in Bereichen wie Fehlerkorrekturcodes, Ähnlichkeitsvergleichen von Bit-Mustern oder kryptografischen Anwendungen.
Die Argumente können als GMP-Objekte, als ganze Zahlen oder als dezimale Zeichenketten übergeben werden. Wichtig: Beide Zahlen müssen nicht-negativ sein (≥ 0); negative Zahlen führen zu einem Fehler, da der Hamming-Abstand für negative Zahlen mit beliebig vielen führenden 1-Bits konzeptionell undefiniert wäre.
Die Funktion ist Teil der GMP-Erweiterung, die für PHP kompiliert oder als dynamisches Modul geladen sein muss. Für sehr große Zahlen oder Fingerprinting-Algorithmen (z.B. SimHash, MinHash) bietet gmp_hamdist eine effiziente und präzise Methode ohne Integer-Overflow-Probleme.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num1 Pflicht | GMP|int|string | Die erste nicht-negative ganze Zahl. Kann als GMP-Objekt, PHP-Integer oder dezimale Zeichenkette angegeben werden. |
|
| $num2 Pflicht | GMP|int|string | Die zweite nicht-negative ganze Zahl. Kann als GMP-Objekt, PHP-Integer oder dezimale Zeichenkette angegeben werden. |
Rückgabewert
num1 und num2 in ihrer binären Darstellung unterscheiden. Ein Rückgabewert von 0 bedeutet, dass beide Zahlen bitweise identisch sind.Beispiele
Einfacher Hamming-Abstand zweier kleiner Zahlen
<?php
// 7 = 0111 (binär)
// 12 = 1100 (binär)
// XOR= 1011 => 3 Bits unterschiedlich
$a = gmp_init(7);
$b = gmp_init(12);
$abstand = gmp_hamdist($a, $b);
echo "Hamming-Abstand zwischen 7 und 12: " . $abstand . PHP_EOL;
// Alternativ direkt mit Integer-Werten:
echo "Hamming-Abstand (direkt): " . gmp_hamdist(7, 12) . PHP_EOL;
Ähnlichkeitsvergleich von Fingerprints großer Zahlen
<?php
// Beispiel: Zwei SimHash-Fingerprints als große Ganzzahlen (64-Bit-ähnlich)
$fingerprint1 = gmp_init('12345678901234567890');
$fingerprint2 = gmp_init('12345678901234567999');
$abstand = gmp_hamdist($fingerprint1, $fingerprint2);
echo "Fingerprint 1: " . gmp_strval($fingerprint1) . PHP_EOL;
echo "Fingerprint 2: " . gmp_strval($fingerprint2) . PHP_EOL;
echo "Hamming-Abstand: " . $abstand . PHP_EOL;
if ($abstand <= 5) {
echo "Die Fingerprints sind sehr ähnlich (Abstand <= 5)." . PHP_EOL;
} else {
echo "Die Fingerprints unterscheiden sich deutlich." . PHP_EOL;
}
Identische Zahlen haben Hamming-Abstand 0
<?php
$zahl = gmp_init(42);
$gleich = gmp_init(42);
echo "Hamming-Abstand (gleiche Zahlen): " . gmp_hamdist($zahl, $gleich) . PHP_EOL;
echo "Hamming-Abstand (0 vs. 0): " . gmp_hamdist(0, 0) . PHP_EOL;
// Wichtig · Fallstricke
Achtung bei negativen Zahlen: gmp_hamdist ist nur für nicht-negative ganze Zahlen (≥ 0) definiert. Wird eine negative Zahl übergeben, erzeugt PHP einen Fehler (ValueError in neueren Versionen). Stellen Sie daher sicher, dass beide Operanden nicht-negativ sind.
Die GMP-Erweiterung muss aktiv sein (extension=gmp in der php.ini). Ohne diese Erweiterung sind alle gmp_*-Funktionen nicht verfügbar.
Ab PHP 8.0 sind die GMP-Funktionen strikter bei der Typprüfung. Zeichenketten müssen gültige dezimale Ganzzahlen darstellen, andernfalls wird ein TypeError geworfen.