AQL 照会でのビット単位演算

ビット単位演算を使用することで、IP アドレスを含む AQL 照会のフィルタリング機能およびパフォーマンスを向上させます。 特定の結果を返すには、IP アドレスのオクテット・レベルでフィルターを指定します。

IP アドレスのオクテットでフィルタリングすることで、IP アドレス検索基準を詳細化できます。

例えば、送信元 IP アドレスの最後のオクテットが 100 で終わる (x.y.z.100 など) 特定のデバイス・タイプを検索するには、以下の照会を使用できます。

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

この例では、<sourceip> が整数として返されます。 その整数はビット単位 AND 演算子で使用されます。 ソース IP アドレスの最後のオクテット位置にある 16 進値 <ff> は、対応する IP アドレス・オクテット位置 0x000000 のフィルターを指定します <IP アドレス・オクテット 16 進値>。 この場合、16 進値 <64> が IP アドレスの 10 進値 100 に置き換えられます。

結果は、100 で終わるすべての送信元 IP アドレスとなります。 すべての IP アドレスの最後のオクテットが 100 である場合、結果は、会社の特定のデバイス・タイプのリストになることがあります。

以下の例では、ビット単位演算を使用して検索を行う際に使用するシナリオの概要を示します。

ビット単位 AND (&) の例

10.xxx.xxx.xxx と一致するすべての IP アドレスを返します。

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

xxx.100.xxx.xxx と一致するすべての IP アドレスを返します。

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

xxx.xxx.220.xxx と一致するすべての IP アドレスを返します。

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

xxx.xxx.xxx.1 と一致するすべての IP アドレスを返します。

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

ビット単位 NOT (~) の例

以下の例を使用して、指定のバイナリー・パターンで、それぞれの 1 ビット値を 0 ビット値に、またはそれぞれの 0 ビット値を 1 ビット値に変換します。

SELECT ~123456789
FROM events
LIMIT 1

123456790 を返します。

SELECT ~0 
FROM events
LIMIT 1

-1 を返します。

SELECT ~2147483647
FROM events
LIMIT 1

- 2147483648 を返します。

ビット単位 OR の例

以下の例を使用して、2 つのビットを比較します。 両方のビットの値が「1」である場合、照会は 1 を戻します。 両方のビットの値が「0」である場合、照会は 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

-1 を返します。

ビット単位 XOR の例

以下の例は、2 ビット・パターンまたは各位置からの 1 対のビットを取得し、それらを 1 または 0 に変換するために使用できます。 ビットが異なっている場合、その位置の結果は 1 になります。 それらのビットが同一の場合、その位置の結果は 0 になります。

SELECT 2147483647#2147483647
FROM events
LIMIT 1

0 を返します。

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

10940、10940 を返します。

ShiftLeft の例

シフトする桁数が、シフト演算子の 2 番目の引数として指定されます。

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

-2 を返します。

SELECT 16<<1 
AS A 
FROMS events 
LIMIT 1

128 を返します。

ShiftRight の例

演算子 >> は、符号ビット (左端のビット) を使用して、シフトで空いた位置を埋めます。 負数の場合はフィルターとして 1 が使用され、正数の場合はフィルターとして 0 が使用されます。

SELECT 16>>3
AS A 
FROMS events 
LIMIT 1

2 を返します。

SELECT -32768>>15 
AS A 
FROMS events 
LIMIT 1
-1 を返します。

ShiftRightUnsigned の例

数値の符号に関わらず、常に 0 で埋めます。

SELECT -1>>>33
FROM events
LIMIT 1

2147483647 を返します。

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