Domanda

Per la mia app server, devo verificare se un indirizzo IP è nella nostra lista nera.

Qual è il modo più efficiente di confrontare gli indirizzi IP? La conversione dell'indirizzo IP in intero e il confronto efficiente?

È stato utile?

Soluzione

Dipende dalla lingua che si sta utilizzando, ma un indirizzo IP viene solitamente memorizzato come numero intero senza segno a 32 bit, almeno a livello di rete, rendendo i confronti abbastanza rapidi. Anche se non lo è, a meno che non si stia progettando un'applicazione di commutazione di pacchetti ad alte prestazioni, non è probabile che si tratti di un collo di bottiglia delle prestazioni. Evita l'ottimizzazione prematura - progetta il tuo programma per verificabilità e scalabilità e se hai problemi di prestazioni puoi usare un profiler per vedere dove si trovano i colli di bottiglia.

Modifica: per chiarire, gli indirizzi IPv4 sono memorizzati come numeri interi a 32 bit, oltre a una maschera di rete (che non è necessaria per i confronti di indirizzi IP). Se stai utilizzando l'IPv6 più recente e attualmente più raro, gli indirizzi saranno lunghi 128 bit.

Altri suggerimenti

I numeri interi a 32 bit sono la strada da percorrere - fino a quando non inizi a gestire gli indirizzi IPv6 a 128 bit.

Sì, ho scoperto che per essere efficiente, ci vorrà molto tempo, e ovviamente devi indicizzare gli IP nella lista nera in forma intera.

Utilizzare uno strumento come PeerGuardian che non consente le connessioni TCP / IP in entrata a livello di driver agli IP in una lista nera. Altamente sicuro, nessun codice richiesto (probabilmente: altamente sicuro, perché nessun codice richiesto).

L'ho fatto e l'ho provato, usare un unsigned int (32 bit) è il più veloce - suppongo che lo stia confrontando con la rappresentazione di stringa.

Un'altra cosa che potrebbe esserti utile è quando ho creato la tabella, in passato ho avuto 2 colonne: LowIP e HighIP; in questo modo sono stato in grado di inserire nella blacklist interi intervalli di IP con 1 record e ottenere comunque buone prestazioni controllando l'IP nell'intervallo.

Una volta ho ereditato il codice in cui qualcuno pensava che archiviare gli indirizzi IP come 4 int fosse una cosa davvero buona, tranne che passavano tutto il tempo a convertirsi in / da int.

Mantenerli come stringhe nel database era molto più semplice e richiedeva solo un singolo indice. Sareste sorpresi di quanto bene SQL Server possa indicizzare le stringhe rispetto a 4 colonne di numeri interi. Ma questo elenco IP non era per la lista nera. Un viaggio di andata e ritorno per il database è piuttosto costoso.

Se un database è eccessivo, memorizzalo in un dizionario in memoria, ma è solo una supposizione poiché non abbiamo idea di quanti ne devi confrontare. Poiché la maggior parte degli hashcode sono int a 32 bit e gli indirizzi IPv4 a 32 bit, l'indirizzo IP stesso potrebbe essere solo un buon hashcode.

Ma come altri sottolineano, l'opzione migliore potrebbe essere quella di ridurre il carico sul server e acquistare hardware specializzato. Forse tieni in memoria IP di recente inseriti nella blacklist e pubblichi periodicamente nuovi nel router.

Se sei tu quello che sta cercando di creare un software all'interno di un router, dovrai cercare il tuo libro delle strutture di dati e creare qualcosa come un b-tree.

Hai un problema esistente con l'efficienza?

Se è così, allora pubblica il codice (o pseudo-codice) e possiamo scegliere il cadavere.

In caso contrario, suggerirei di provare qualcosa di semplice come archiviare le voci in un elenco ordinato e utilizzare Sort () e Find () esistenti nel tuo ambiente.

I confronti di numeri interi sono molto più veloci dei confronti di stringhe.

Se memorizzi i numeri interi in un elenco ordinato, puoi trovarli più velocemente che in un elenco non ordinato.

se si riceve l'indirizzo IP come stringa, confrontarlo con una stringa può essere più efficiente rispetto alla conversione in una rappresentazione intera

ma definirei entrambe le soluzioni per essere certi, se qualche millisecondo (nanosecondi!) avrà importanza per questa operazione ;-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top