0

バージョン 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);
}
4

1 に答える 1

0

わお。ドキュメントにない内部 PostgreSQL 関数を使用しています。

hash_any() が真のハッシュである hash_any() を呼び出すように見えるので、これを行う方法はありません。

単に任意の int を IP アドレスに結び付けるだけでなく、int を意味のある有用なものにする必要がある場合は、新しい関数を作成して IP アドレスを int に作成することをお勧めします。

 CREATE FUNCTION inet_to_int(inet) RETURNS INT language sql immutable AS 
 $$
 SELECT $1 - '0.0.0.0'::inet;
 $$;

それからそれを使用します。そこから、プライベート範囲が int 範囲に対応し、より簡単に確認できます。

たとえば、10/8 アドレスはBETWEEN 167772160 AND 184549375....

于 2013-03-22T01:38:27.287 に答える