Operadores bit a bit en consultas AQL

Mejore la capacidad de filtrado y el rendimiento de las consultas AQL que incluyen direcciones IP utilizando operadores bit a bit. Especifique filtros en el nivel de octeto de dirección IP para devolver resultados específicos.

Al filtrar por octetos en una dirección IP, puede refinar los criterios de búsqueda de dirección IP.

Por ejemplo, para buscar tipos de dispositivo específicos cuyo último octeto en una dirección IP de origen termina en 100, como por ejemplo x.y.z.100, puede utilizar la consulta siguiente:

SELECT LONG(sourceip)AS long_ip, 
sourceip
FROM events into <cursor_name>
WHERE (long_ip & 0x000000ff)=0x00000064
GROUP BY long_ip
ORDER BY long_ip

En el ejemplo, <sourceip> se devuelve como un entero. El operador AND a nivel de bit utiliza el entero. El valor hexadecimal <ff> en la última posición de octeto para la dirección IP de origen especifica un filtro en la posición de octeto de dirección IP correspondiente de 0x000000 <valor hexadecimal de octeto de dirección IP>. En este caso, el valor hexadecimal <64> se sustituye por el valor decimal 100 en la dirección IP.

El resultado son todas las direcciones IP de origen que terminan en 100. Los resultados pueden ser una lista de un tipo de dispositivo específico para una empresa, si el último octeto de todas las direcciones IP es 100.

En los ejemplos siguientes se describen los escenarios que se deben utilizar cuando se realiza la búsqueda con operadores bit a bit.

AND a nivel de bit (&) ejemplos

Devuelve todas las direcciones IP que coinciden con 10.xxx.xxx.xxx

SELECT LONG(sourceip)AS long_ip, 
sourceip
FROM events into t1
WHERE (long_ip & 0xff000000)=0x0a000000 
GROUP BY long_ip 
LIMIT 50

Devuelve todas las direcciones IP que coinciden con xxx.100.xxx.xxx

SELECT LONG(sourceip)AS long_ip, 
sourceip
FROM events into t2
WHERE (long_ip & 0x00ff0000)=0x0064000
GROUP BY long_ip
ORDER BY long_ip 

Devuelve todas las direcciones IP que coinciden con xxx.xxx.220.xxx

SELECT LONG(sourceip)AS long_ip, 
sourceip
FROM events into t3
WHERE (long_ip & 0x0000ff00)=0x000dc00
GROUP BY long_ip
ORDER BY long_ip 

Devuelve todas las direcciones IP que coinciden con xxx.xxx.xxx.1

SELECT LONG(sourceip)AS long_ip, 
sourceip
FROM events
WHERE (long_ip & 0x000000ff)=0x0000001
GROUP BY long_ip
ORDER BY long_ip 

Ejemplos de NOT (~) bit a bit

Utilice los ejemplos siguientes para convertir cada valor de 1 bit a un valor de 0 bits, o cada valor de 0 bits a un valor de 1 bit, en un patrón binario determinado.

SELECT ~123456789
FROM events
LIMIT 1

Devuelve 123456790

SELECT ~0 
FROM events
LIMIT 1

Devoluciones-1

SELECT ~2147483647
FROM events
LIMIT 1

Devoluciones-2147483648

Ejemplos de OR a nivel de bit

Utilice los ejemplos siguientes para comparar dos bits. Si ambos bits tienen un valor de "1", la consulta devuelve un 1. Si ambos bits tienen un valor de "0", la consulta devuelve un 0.

SELECT destinationip, 
LONG(destinationip),
sourceip,
LONG(sourceip)AS source_ip,
LONG(destinationip)|source_ip
FROM events
WHERE destinationip='127.0.0.1' 
LIMIT 1
SELECT destinationip, 
LONG(destinationip),
sourceip,
~LONG(sourceip)AS not_source_ip,
LONG(destinationip)|not_source_ip
FROM events 
WHERE destinationip='127.0.0.1'
LIMIT 1
SELECT-2147483648|2147483647
FROM events
LIMIT 1

Devoluciones-1

Ejemplos de XOR bit a bit

Los ejemplos siguientes se pueden utilizar para tomar patrones de 2 bits, o un par de bits de cada posición, y convertirlos a 1 o 0. Si los bits son diferentes, el resultado en esa posición es 1. Si los bits son idénticos, el resultado en esa posición es 0.

SELECT 2147483647#2147483647
FROM events
LIMIT 1

Devuelve 0

SELECT 12345#6789 
AS A,
(~12345 & 6789)|(12345 & ~6789)
AS B
FROM events
LIMIT 1  

Devuelve 10940, 10940

Ejemplos de ShiftLeft

El número de lugares a desplazar se proporciona como segundo argumento para el operador de turno.

SELECT -1<<1 
AS A 
FROMS events 
LIMIT 1

Devoluciones-2

SELECT 16<<1 
AS A 
FROMS events 
LIMIT 1

Devuelve 128

Ejemplos de ShiftRight

El operador > > utiliza el bit de signo, que es el bit situado más a la izquierda, para rellenar las posiciones finales después del turno. Si el número es negativo, se utiliza 1 como filtro y si el número es positivo, se utiliza 0 como filtro.

SELECT 16>>3
AS A 
FROMS events 
LIMIT 1

Devuelve 2

SELECT -32768>>15 
AS A 
FROMS events 
LIMIT 1
Devoluciones-1

ShiftRightUnsigned ejemplo

Siempre rellena 0 independientemente del signo del número.

SELECT -1>>>33
FROM events
LIMIT 1

Devuelve 2147483647

Dividiendo por el poder de 2.

SELECT (20+44)>>>1 A,
(20+44)>>>2 B,
(20+44)>>>3 C,
(20+44)>>>4 D,
(20+44)>>>5 E
FROM events
LIMIT 1