我试图创建存储的十六进制数的哈希函数,但我不知道什么是哈希函数是。我得到它是从一个文本文件中的十六进制数的地址,然后将它们转换成无符号长long int类型。我试图创建大小为1000的哈希表,那么究竟我能得到什么,当我把这些长长的整数?我完全不明白这一点。
输入文件包含这样几行:
0x7f1a91026b00
0x7f1a91026b03
0x7f1a91027130
0x7f1a91027131
0x7f1a91027134
0x7f1a91027136
这里是我到目前为止的代码(我没有在时刻创建的哈希表,因为我没有散列函数)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char **argv){
if(argc!=2){
printf("error\n");
return 0;
// if there is no input then print an error
}
FILE *file = fopen(argv[1], "r"); // open file
if (!file){
printf("error\n");
return 0;
}
char linestring[BUFSIZ];
while (fgets(linestring, sizeof(linestring), file)) // reads the entire file until it hits Null
{
char *endptr;
unsigned long long key = strtoull(linestring, &endptr, 16);
printf("%s\n", linestring);
}
fclose(file);
}
十六进制,十进制和八进制仅仅3种不同的打印到屏幕相同数量的方法。
让我们来看看100号我们可以在小数打印为100
。同样,我们可以在八进制打印为0144
。我们可以用十六进制打印为0x64
。
但是,所有这三个都代表相同的号码。所以100 / 3
,0144 / 3
和0x64 / 3
的结果都是相同的。
你有许多x
。你想限制x
是[0, 0x1000)
之间的数字。要做到这一点,最简单的方法是做:
unsigned long long x;
unsigned long long y = x % 0x1000;
现在Ÿ将[0, 0x1000)
的范围内。这基本上是通过从0x1000
减去x
直到它小于0x1000
完成。
所以,如果你想在1000哈希表的大小,那么你需要得到了0x3e8的模所以例如0x7f1a91026b00%了0x3e8 = 0x20的。这表示在癸32。
十六进制了0x3e8 = 1000年12月。