gpt4 book ai didi

c - 如何编译和运行FNV Hash

转载 作者:行者123 更新时间:2023-11-30 15:31:35 26 4
gpt4 key购买 nike

我正在研究开源哈希函数,以观察源代码和哈希算法如何处理哈希冲突。我目前对低位哈希函数感兴趣,我通过其他 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$

关于我必须专门编译哪些文件才能运行和测试程序有什么想法吗?

感谢您提前提供的帮助

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 以了解如何实际运行测试,但我第一次没有看到

最佳答案

当我下载 FNV 5.0.3 并在 Mac 上构建它时,我收到许多关于格式字符串中的转换规范与实际传递的参数之间不匹配的编译器警告。但是,当我运行 make check 时,代码报告测试 vector 全部通过。 (它使用 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 并不是设计为单独编译成程序的;它是图书馆的一部分。

关于c - 如何编译和运行FNV Hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24701350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com