バージョン 8.3 からフォークされた PostgreSQL の MPP バージョンを使用しています。
inet である ip_address と呼ばれる列と、bigint である hash_ip_address と呼ばれる別の列を含む大きなテーブルがあります。hash_ip_address 列のすべての値は、ハッシュネット関数を使用して ip_address 列から変換された値です。整数値を使用して、アドレスがプライベートかパブリックかを判断しようとしています。私が抱えている問題は、以下の例のように正の値と負の値があるため、IP アドレスの整数値がプライベートかどうかを確認する一般的な方法が見当たらないことです。
select hashinet('10.10.0.1'::inet);
hashinet
-------------
-1939051471
(1 row)
select hashinet('10.0.0.4'::inet);
hashinet
------------
1510004552
(1 row)
ハシネット関数から変換された整数値のみを使用して、IP アドレスがプライベートかどうかを判断する方法はありますか?
編集: http://doxygen.postgresql.org/network_8c.html#a0baabf8b98dbbcc39c6c1c814f9d86f8からのハッシュネット関数の定義は次のとおりです。
データム ハシネット ( PG_FUNCTION_ARGS )
ファイル network.c の 527 行での定義。
hash_any()、ip_addrsize()、PG_GETARG_INET_PP、および VARDATA_ANY を参照します。
{
inet *addr = PG_GETARG_INET_PP(0);
int addrsize = ip_addrsize(addr);
/* XXX this assumes there are no pad bytes in the data structure */
return hash_any((unsigned char *) VARDATA_ANY(addr), addrsize + 2);
}