4 Stimmen

Hashing einer IP-Adresse zu einer Zahl in [0, H)

Ich verwende Python 2.6. Ich habe sehr wenig Wissen über Hash-Funktionen.

Ich möchte eine CRC-Hash-Funktion verwenden, um eine IP-Adresse wie "128.0.0.5" in den Bereich [0, H] zu hacken. Derzeit denke ich an Folgendes

zlib.crc32('128.0.0.5')%H.

Ist das in Ordnung? Es gibt ein paar Fragen, die Sie versuchen könnten zu beantworten...

  • Macht es einen Unterschied, ob ich den Hashwert "128.0.0.5" oder den Binärwert "0001110101010 " verwende, was auch immer das ist, oder ob ich die '.'s weglasse?

  • zlib.crc32 gibt eine vorzeichenbehaftete Ganzzahl zurück. Ergibt die Modifikation (%) eines neg. mit einem positiven H immer ein pos no?

  • Beeinflusst die Angabe von % durch H die Qualität der Hash-Funktion (ich meine, ist das das Beste, was ich mit dem verfügbaren Platz und der verfügbaren xlib.crc32 erreichen konnte)?

Gracias.

5voto

jathanism Punkte 31729

Warum wollen Sie eine IP-Adresse in eine Zahl umwandeln? Sie haben bereits eine native Integer-Darstellung. Zum Beispiel, mit netaddr :

>>> import netaddr
>>> ip = netaddr.IPAddress('192.168.1.1')
>>> ip.value
3232235777
>>> netaddr.IPAddress(3232235777)
IPAddress('192.168.1.1')

2voto

Hyperboreus Punkte 31109

Ad 1) Sie führt zu unterschiedlichen Ergebnissen, hat aber keinen Einfluss auf die Qualität des Hashes.

ad 2) Sie ergibt immer eine positive Zahl oder Null.

ad 3) Die Begrenzung der Anzahl möglicher Eimer wirkt sich auf die Qualität des Hashes aus.

Generell: Wie groß ist etwa Ihr H? Denken Sie daran, dass eine IPv4-Adresse nichts anderes als ein 32-Bit-Wert ist. 192.168.0.1 ist nur eine für den Menschen besser lesbare byteweise Darstellung. Wenn Ihr H also größer als 4294967295 ist, ist ein Hashing nicht erforderlich.

2voto

ngn Punkte 7412

Macht es einen Unterschied, ob ich den Hashwert "128.0.0.5" oder den Binärwert "0001110101010 " verwende, was auch immer das sein mag, oder ohne die '.'s

Nicht wirklich.

zlib.crc32 gibt eine vorzeichenbehaftete Ganzzahl zurück. Ergibt die Modifikation (%) eines neg. mit einem positiven H immer ein pos no?

Ja.

Beeinflusst die Angabe von % durch H die Qualität der Hash-Funktion (ich meine, ist das das Beste, was ich mit dem verfügbaren Platz und der verfügbaren xlib.crc32 erreichen konnte)?

Sie sollten besser alle Bits der Prüfsumme verwenden, um den fehlenden "Lawineneffekt" auszugleichen. Einstellige Varianten wie 192.168.1.1 , 192.168.1.2 usw. können Unterschiede nur in den ersten Bits der Prüfsumme auftreten, und da % sich nur um die letzten Bits kümmert, werden die Hashes kollidieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X