6

0xc0003000から0xc04a0144までのメモリアドレスのリストがあります。リストには多くのギャップがあり、4096未満のエントリがあります。コンパイル時に既知であり、完璧なハッシュを作成したいと思います。

ただし、完全なハッシュをオンラインで検索すると、主にハッシュ文字列に関連する情報が得られ、それらはうまく翻訳されていないようです。

明確にするために、実行時にメモリアドレスを取得し、それがハッシュにすばやく含まれていることを確認できるようにしたいと思います。現在、私は答えを見つけるために平均して約8ループの二分探索を使用しています。

樹皮を張るべき木はありますか?

4

1 に答える 1

3

これがサンプルのgperfプログラムです。サンプルデータにNULと改行を含めて、失敗しないことを証明しました。

%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <arpa/inet.h>
%}
%%
"\xc0\x01\x02\x03"
"\xc0\xff\xff\xff"
"\xc0\xff\x00\xff"
"\xc0\x0a\xff\xff"
%%
int main(int argc, const char **argv)
{
    int i;

    for(i=1;i<argc;++i) {
        uint32_t addr = ntohl(strtoul(argv[i], 0, 16));
        if(in_word_set((char *)&addr, 4))
            printf("0x%08"PRIx32" is in the list.\n", htonl(addr));
        else
            printf("0x%08"PRIx32" is not in the list.\n", htonl(addr));
    }
    return 0;
}

名前を付けて保存しaddrs.gperf、コンパイルしてテストします

gperf -l addrs.gperf > addrs.c
gcc addrs.c -o addrs
./addrs c0000000 c0010203 c0ffffff c00affff c0ff0aff c0ffff00 c0ff00ff
于 2012-07-27T20:31:36.860 に答える