track descargar address ip-address

ip-address - descargar - show my ip



¿Cómo compararías la dirección IP? (12)

Para mi aplicación de servidor, necesito verificar si hay una dirección IP en nuestra lista negra.

¿Cuál es la forma más eficiente de comparar direcciones IP? ¿Convertiría la dirección IP a un número entero y los compararía de manera eficiente?


¿Quiere decir si debería compararlo como una cadena de texto o convertir int a int y comparar como un int?

Ese no suele ser el cuello de botella en este tipo de búsquedas. simplemente puede intentar implementar ambos métodos y ver cuál funciona más rápido.

El verdadero problema con la búsqueda de direcciones IP generalmente es realizar consultas eficientes, aprovechando el hecho de que se trata de direcciones IP y no solo de números aleatorios. para lograr esto, puede buscar LC trie y tal vez este artículo

Obviamente, esto debería interesarle solo si su lista negra contiene decenas de miles o millones de entradas. Si tiene solo 10-20 entradas, se debe preferir una búsqueda lineal y, de hecho, la pregunta más interesante es la comparación textual frente a la comparación de enteros.


¿Tiene un problema existente con la eficiencia?

Si es así, publique el código (o seudocódigo) y podremos elegir el cadáver.

De lo contrario, sugeriría probar algo simple como almacenar las entradas en una lista ordenada y usar Sort() y Find() existentes en su entorno.


Depende del idioma que esté usando, pero una dirección IP generalmente se almacena como un entero sin signo de 32 bits, al menos en la capa de red, lo que hace que las comparaciones sean bastante rápidas. Incluso si no lo es, a menos que esté diseñando una aplicación de conmutación de paquetes de alto rendimiento, no es probable que sea un cuello de botella de rendimiento. Evite la optimización prematura: diseñe su programa para la capacidad de prueba y la escalabilidad y, si tiene problemas de rendimiento, puede utilizar un generador de perfiles para ver dónde están los cuellos de botella.

Editar: para aclarar, las direcciones IPv4 se almacenan como enteros de 32 bits, más una máscara de red (que no es necesaria para las comparaciones de direcciones IP). Si está utilizando el IPv6 más nuevo y actualmente más raro, las direcciones tendrán 128 bits de longitud.


He hecho esto y lo he probado, usando unsigned int (32 bit) es el más rápido, supongo que estás comparando esto con la representación de cadena.

Otra cosa que podría ayudarte es cuando creas la tabla, en el pasado tuve 2 columnas: LowIP y HighIP; De esa manera, he podido poner en la lista negra rangos enteros de IP con 1 entrada de registro y todavía obtener un buen rendimiento al verificar la IP en el rango.


Las comparaciones enteras son mucho más rápidas que las comparaciones de cadenas.

Si almacena los enteros en una lista ordenada, puede encontrarlos más rápido que en una lista desordenada.


Los enteros de 32 bits son el camino a seguir, hasta que comiences a manejar direcciones IPv6 de 128 bits.


Sí, he descubierto que para ser eficiente, será un largo tiempo, y por supuesto tendrá que indexar las IP incluidas en la lista negra en forma de número entero.


Una vez heredé un código en el que alguien pensó que almacenar direcciones IP como 4 int era algo realmente bueno, excepto que pasaban todo el tiempo convirtiendo a / desde int.

Mantenerlos como cadenas en la base de datos era mucho más fácil, y solo requería un índice único. Se sorprendería de lo bien que el servidor SQL puede indexar cadenas en lugar de 4 columnas de números enteros. Pero esta lista de IP no era para listas negras. Una base de datos de ida y vuelta es bastante costosa.

Si una base de datos es exagerada, guárdala en un diccionario en la memoria, pero eso es solo una suposición, ya que no tenemos idea de cuántas necesitas comparar. Como la mayoría de los códigos hash son int de 32 bits, y las direcciones IPv4 son de 32 bits, la dirección IP en sí misma podría ser un buen hashcode.

Pero, como otros señalan, la mejor opción podría ser reducir la carga en su servidor y comprar hardware especializado. Tal vez conserve las IP de la lista negra en la memoria y periódicamente publique una nueva en el enrutador.

Si usted es el que está tratando de crear algún software dentro de un enrutador, necesitará pescar su libro de estructuras de datos y crear algo así como un b-tree.


Use una herramienta como PeerGuardian que no permite las conexiones TCP / IP entrantes en el nivel del controlador a las IP en una lista negra. Altamente seguro, no se requiere código (podría decirse que es altamente seguro, porque no se requiere código).


si recibe la dirección IP como una cadena, compararla con una cadena puede ser más eficiente que convertirla en una representación entera

pero me gustaría perfilar ambas soluciones para estar seguro, si unos pocos milisegundos (nanosegundos!) van a importar en esta operación ;-)



static public bool IsEqual(string ToCompare, string CompareAgainst) { return IPAddressToLongBackwards(ToCompare)==IPAddressToLongBackwards(CompareAgainst); } static private uint IPAddressToLongBackwards(string IPAddr) { System.Net.IPAddress oIP=System.Net.IPAddress.Parse(IPAddr); byte[] byteIP=oIP.GetAddressBytes(); uint ip=(uint)byteIP[0]<<24; ip+=(uint)byteIP[1]<<16; ip+=(uint)byteIP[2]<<8; ip+=(uint)byteIP[3]; return ip; }

Si te entiendo correctamente, este es el código para comparar dos direcciones IP, ¿quieres esto? puedes hacer cosas como ...

static public bool IsGreater(string ToCompare, string CompareAgainst) { return IPAddressToLongBackwards(ToCompare)> IPAddressToLongBackwards(CompareAgainst); }

porque tienes los bytes de direcciones ... Si te gusta eso, entonces vota por mí, pero por favor no me votes negativo