Start · Sprachen · PHP · Referenz · gmp_hamdist

gmp_hamdist

Funktion

Berechnet den Hamming-Abstand zwischen zwei GMP-Zahlen, d.h. die Anzahl der Bit-Positionen, an denen sich die binären Darstellungen unterscheiden.

seit PHP 4.0.4 Kategorie: math

Signatur

gmp_hamdist(GMP|int|string $num1, GMP|int|string $num2): int

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

Typ
int
Beschreibung
Gibt die Anzahl der Bit-Positionen zurück, an denen sich 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;
Hamming-Abstand zwischen 7 und 12: 3 Hamming-Abstand (direkt): 3

Ä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;
}
Fingerprint 1: 12345678901234567890 Fingerprint 2: 12345678901234567999 Hamming-Abstand: 5 Die Fingerprints sind sehr ähnlich (Abstand <= 5).

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;
Hamming-Abstand (gleiche Zahlen): 0 Hamming-Abstand (0 vs. 0): 0

// 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.