我正在研究开源散列函数,以观察源代码和散列算法如何处理散列冲突。我目前对低位散列函数感兴趣,我通过另一个post
发现了FNV但是,有谁知道我如何才能真正测试这个特定的源代码?我已经尝试编译一些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$
关于我必须专门编译哪些文件以运行和测试程序的任何想法?
感谢您的提前帮助
运行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以了解如何实际运行测试,但我没有看到第一次
答案 0 :(得分:1)
当我下载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
:
$ 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网站。这取决于我使用更严格的编译选项运行时获得多少choss。
但是,您的直接问题是test_fnv.c
不能单独编译成程序;它是图书馆的一部分。
答案 1 :(得分:0)
所以你已经拥有了libfnv.a库,你只需要在自己的程序中包含fnv头,然后像这样运行gcc
gcc -I/path/to/header/of/fnv yourmain.c -L/path/to/libfnv.a -lfnv
假设主要功能在yourmain.c
。