代码之家  ›  专栏  ›  技术社区  ›  humblebeast

如何编译和运行FNV哈希

  •  0
  • humblebeast  · 技术社区  · 11 年前

    我正在研究开源哈希函数,以观察源代码和哈希算法如何处理哈希冲突。我目前对低位哈希函数感兴趣,我通过另一个发现了FNV post

    然而,有人知道我如何实际测试这个特定的源代码吗?我尝试过编译一些C文件,但我总是从gcc中得到错误:

    hb2@hb1:~/Desktop/fnv$ gcc test_fnv.c
    test_fnv.c: In function ‘unknown_hash_type’:
    test_fnv.c:2183:5: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
    test_fnv.c: In function ‘print_fnv32’:
    test_fnv.c:2200:2: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘Fnv32_t’ [-Wformat]
    test_fnv.c:2202:2: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘Fnv32_t’ [-Wformat]
    test_fnv.c: In function ‘print_fnv64’:
    test_fnv.c:2221:2: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘Fnv64_t’ [-Wformat]
    test_fnv.c:2223:2: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘Fnv64_t’ [-Wformat]
    /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
    (.text+0x20): undefined reference to `main'
    collect2: ld returned 1 exit status
    hb2@hb1:~/Desktop/fnv$
    

    我需要专门编译哪些文件来运行和测试程序,有什么想法吗?

    提前感谢您的帮助

    FNV: info , download

    运行make check后,我得到以下信息:

    hb2@hb1:~/Desktop/fnv$ make check
    forming longlong.h
    longlong.h formed
    cc -O3 -g3 fnv32.c -c
    fnv32.c: In function ‘test_fnv32’:
    fnv32.c:156:11: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘Fnv32_t’ [-Wformat]
    fnv32.c:169:8: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 4 has type ‘Fnv32_t’ [-Wformat]
    fnv32.c:169:8: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 5 has type ‘Fnv32_t’ [-Wformat]
    fnv32.c:183:8: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 4 has type ‘Fnv32_t’ [-Wformat]
    fnv32.c:183:8: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 5 has type ‘Fnv32_t’ [-Wformat]
    fnv32.c:197:8: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 4 has type ‘Fnv32_t’ [-Wformat]
    fnv32.c:197:8: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 5 has type ‘Fnv32_t’ [-Wformat]
    cc -O3 -g3 hash_32.c -c
    cc -O3 -g3 hash_64.c -c
    cc -O3 -g3 hash_32a.c -c
    cc -O3 -g3 hash_64a.c -c
    cc -O3 -g3 test_fnv.c -c
    test_fnv.c: In function ‘unknown_hash_type’:
    test_fnv.c:2183:5: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
    test_fnv.c: In function ‘print_fnv32’:
    test_fnv.c:2200:2: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘Fnv32_t’ [-Wformat]
    test_fnv.c:2202:2: warning: format ‘%lx’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘Fnv32_t’ [-Wformat]
    test_fnv.c: In function ‘print_fnv64’:
    test_fnv.c:2221:2: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘Fnv64_t’ [-Wformat]
    test_fnv.c:2223:2: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘Fnv64_t’ [-Wformat]
    rm -f libfnv.a
    ar rv libfnv.a hash_32.o hash_64.o hash_32a.o hash_64a.o test_fnv.o
    ar: creating libfnv.a
    a - hash_32.o
    a - hash_64.o
    a - hash_32a.o
    a - hash_64a.o
    a - test_fnv.o
    : libfnv.a
    cc fnv32.o libfnv.a -o fnv032
    cc -O3 -g3 fnv64.c -c
    fnv64.c: In function ‘test_fnv64’:
    fnv64.c:160:10: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 3 has type ‘Fnv64_t’ [-Wformat]
    fnv64.c:175:8: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 4 has type ‘Fnv64_t’ [-Wformat]
    fnv64.c:175:8: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 5 has type ‘Fnv64_t’ [-Wformat]
    fnv64.c:190:8: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 4 has type ‘Fnv64_t’ [-Wformat]
    fnv64.c:190:8: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 5 has type ‘Fnv64_t’ [-Wformat]
    fnv64.c:205:8: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 4 has type ‘Fnv64_t’ [-Wformat]
    fnv64.c:205:8: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 5 has type ‘Fnv64_t’ [-Wformat]
    cc fnv64.o libfnv.a -o fnv064
    rm -f fnv132
    cp -f fnv032 fnv132
    rm -f fnv164
    cp -f fnv064 fnv164
    rm -f fnv1a32
    cp -f fnv032 fnv1a32
    rm -f fnv1a64
    cp -f fnv064 fnv1a64
    FNV-0 32 bit tests: passed
    FNV-1 32 bit tests: passed
    FNV-1a 32 bit tests: passed
    FNV-0 64 bit tests: passed
    FNV-1 64 bit tests: passed
    FNV-1a 64 bit tests: passed
    hb2@hb1:~/Desktop/fnv$ 
    

    也许这就是我应该得到的,我会更深入地阅读FNV,看看如何实际运行测试,但我第一次没有看到

    2 回复  |  直到 8 年前
        1
  •  1
  •   Jonathan Leffler    11 年前

    当我下载FNV 5.0.3并在Mac上构建它时,我收到了许多关于格式字符串中的转换规范与实际传递的参数不匹配的编译器警告。然而,当我跑步时 make check ,代码报告测试向量全部通过。(它使用 echo -n 但是 echo 我不认识 -n 作为选项,因此输出看起来有点奇怪。)

    生成输出示例:

    $ make
    forming longlong.h
    longlong.h formed
    cc -O3 -g3 hash_32.c -c
    cc -O3 -g3 hash_64.c -c
    cc -O3 -g3 hash_32a.c -c
    cc -O3 -g3 hash_64a.c -c
    cc -O3 -g3 test_fnv.c -c
    test_fnv.c:2183:5: warning: implicitly declaring library function 'exit' with type 'void (int)
          __attribute__((noreturn))'
        exit(code);
        ^
    test_fnv.c:2183:5: note: please include the header <stdlib.h> or explicitly provide a declaration
          for 'exit'
    test_fnv.c:2200:25: warning: format specifies type 'unsigned long' but the argument has type
          'unsigned int' [-Wformat]
            printf("0x%08lx %s\n", hval & mask, arg);
                      ~~~~~        ^~~~~~~~~~~
                      %08x
    test_fnv.c:2202:22: warning: format specifies type 'unsigned long' but the argument has type
          'unsigned int' [-Wformat]
            printf("0x%08lx\n", hval & mask);
                      ~~~~~     ^~~~~~~~~~~
                      %08x
    3 warnings generated.
    rm -f libfnv.a
    ar rv libfnv.a hash_32.o hash_64.o hash_32a.o hash_64a.o test_fnv.o
    ar: creating archive libfnv.a
    a - hash_32.o
    a - hash_64.o
    a - hash_32a.o
    a - hash_64a.o
    a - test_fnv.o
    : libfnv.a
    cc -O3 -g3 fnv32.c -c
    fnv32.c:156:21: warning: format specifies type 'unsigned long' but the argument has type
          'unsigned int' [-Wformat]
                        tstnum-1, hval & mask);
                                  ^~~~~~~~~~~
    fnv32.c:168:17: warning: format specifies type 'unsigned long' but the argument has type
          'unsigned int' [-Wformat]
                                program, (hval&mask),
                                         ^~~~~~~~~~~
    fnv32.c:169:8: warning: format specifies type 'unsigned long' but the argument has type
          'unsigned int' [-Wformat]
                                (fnv0_32_vector[tstnum-1].fnv0_32 & mask));
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    fnv32.c:182:17: warning: format specifies type 'unsigned long' but the argument has type
          'unsigned int' [-Wformat]
                                program, (hval&mask),
                                         ^~~~~~~~~~~
    fnv32.c:183:8: warning: format specifies type 'unsigned long' but the argument has type
          'unsigned int' [-Wformat]
                                (fnv1_32_vector[tstnum-1].fnv1_32 & mask));
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    fnv32.c:196:17: warning: format specifies type 'unsigned long' but the argument has type
          'unsigned int' [-Wformat]
                                program, (hval&mask),
                                         ^~~~~~~~~~~
    fnv32.c:197:8: warning: format specifies type 'unsigned long' but the argument has type
          'unsigned int' [-Wformat]
                                (fnv1a_32_vector[tstnum-1].fnv1a_32 & mask));
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    fnv32.c:159:14: warning: 4 enumeration values not handled in switch: 'FNV_NONE', 'FNV0_64',
          'FNV1_64'... [-Wswitch]
                switch (hash_type) {
                        ^
    8 warnings generated.
    cc fnv32.o libfnv.a -o fnv032
    cc -O3 -g3 fnv64.c -c
    fnv64.c:164:14: warning: 4 enumeration values not handled in switch: 'FNV_NONE', 'FNV0_32',
          'FNV1_32'... [-Wswitch]
                switch (hash_type) {
                        ^
    1 warning generated.
    cc fnv64.o libfnv.a -o fnv064
    rm -f fnv132
    cp -f fnv032 fnv132
    rm -f fnv164
    cp -f fnv064 fnv164
    rm -f fnv1a32
    cp -f fnv032 fnv1a32
    rm -f fnv1a64
    cp -f fnv064 fnv1a64
    $
    

    跑步 核对,核对 :

    $ make check
    -n FNV-0 32 bit tests: 
    passed
    -n FNV-1 32 bit tests: 
    passed
    -n FNV-1a 32 bit tests: 
    passed
    -n FNV-0 64 bit tests: 
    passed
    -n FNV-1 64 bit tests: 
    passed
    -n FNV-1a 64 bit tests: 
    passed
    $
    

    警告并不理想。如果我精力充沛,我可能会制作补丁并将其提交给FNV网站。这取决于当我使用更严格的编译选项运行时得到的选择。

    您的主要问题已解决

    然而,您当前的问题是 test_fnv.c 并非设计为自行编译成程序;它是图书馆的一部分。

        2
  •  0
  •   Enzo    11 年前

    所以你已经有了libfnv.a库,你只需要在自己的程序中包含fnv头,然后像这样运行gcc

    gcc -I/path/to/header/of/fnv yourmain.c -L/path/to/libfnv.a -lfnv
    

    假设主函数位于 yourmain.c .