IP verkürzen

September 2009

Wenn man aus irgend einem Grund viele IPs sammelt, würde es sich anbieten, diese zu verkürzen.
Mit einem kurzen Skript kann man eine IPv4 von durchschnittlich 12 Zeichen auf 8 oder gar 6 ohne Informationsverlust beschränken.

Im folgenden Skript werden die dezimalen Bestandteile der IP in hexadezimale, zweistellige Zahlen umgewandelt, wodurch die Punkte weggelassen werden können.
<?php
$ip 
'123.45.67.89';
$ip_split explode('.'$ip);
foreach(
$ip_split as &$split){
  
$split dechex($split);
  if(
strlen($split)===1)
    
$split '0'.$split;
}
$ip_hex implode(''$ip_split);
echo 
$ip_hex;
# Ausgabe: 7b2d4359
?>
Und aus 127.0.0.1 wird 7f000001.


Wenn es die Umstände erlauben, können die Teile der IP auch als Zeichencode interpretiert und mit chr() in das entsprechende Zeichen umgewandelt werden, womit die IP nun nur noch eine Länge von vier Bytes besitzt. [1]
<?php
$ip 
'123.45.67.89';
$ip_split explode('.'$ip);
$ip_split array_map('chr'$ip_split);
$ip implode(''$ip_split);
echo 
$ip;
# Ausgabe: {-CY
?>
Bei 127.0.0.1 würden hier zwei Null-Bytes entstehen. Diese Tatsache kann in manchen Situationen zu Problemen führen...

Doch gibt es hierbei einen Trick, um dieses Problem zu umgehen, indem man sich Base64 zu Nutze macht. So werden die vier Bytes in 100% darstellbare Zeichen umgewandelt.
<?php
...
$ip base64_encode($ip);
echo 
$ip;
# Ausgabe: ey1DWQ==
?>
Nun, wer das Prinzip von Base64 kennt, weiss was die beiden Gleich-Zeichen am Ende bedeuten, und er wird auch verstehen, warum man sie abschneiden kann, ohne dass dabei Daten verloren gehen.
<?php
...
$ip substr($ip0, -2);
echo 
$ip;
# Ausgabe: ey1DWQ
?>
Auf diese Weise kann jede IP-Adresse auf genau sechs Zeichen verkürzt werden.

Siehe auch:

[1] In der Realität besteht die IP nur aus vier Bytes, sie wird jedoch zur Leserlichkeit in vier mit Punkten getrennte Zahlen umgewandelt, wobei jede Zahl für ein Byte steht.
 


Andere Einträge


Kommentare

#1
von Jakob Rohländer am 09.06.2014
Ich würde wenn ich die IP Adressen von Nutzern speichern würde, nur als Hash speichern.