私は高速になるように設計されたCでプログラムを書いています。
データフロー内の IP アドレスの出現回数を保存したいと考えています。たとえば、約 2 000 000 の IP アドレスを含む 100MB のバイナリ ファイルを分析します (ただし、プログラムは x-GB ファイルにも使用される可能性があります)。
私の考えはハッシュテーブルを使用することなので、これらのハッシュ関数が必要です:
20b_int indexToIPv4HashTable = hashIPv4(32b_int addr4);
20b_int indexToIPv6HashTable = hashIPv6(128b_int addr6);
この関数がいつか衝突しても問題はないと思います (Separate chaining を使用してこれを解決します)。
- どのハッシュ関数を使用すればよいですか?
- この問題にはハッシュ テーブルを使用することをお勧めします。
ちょっとした数学:
- 20b index = 1 048 576 要素 (足りるか? )
- 32b 要素 = 4B 要素 = 4MB テーブル サイズ (プログラムが現在のコンピュータで実行される場合、このサイズは問題ありませんか? )
注: IP アドレスでマスクが指定されている場合があります。例: IPv4/24 --> 現在、2^32 ではなく 2^24 の異なる IPv4 アドレスしかありません。マスクが設定されている場合、別のハッシュ テーブル サイズを使用する必要がありますか?
絶対に優先するのはスピードです。