当你划分一个十六进制时,你会得到什么?
When you divide a hexadecimal, what do you get?
我正在尝试创建一个存储十六进制的散列函数,但我不确定该散列函数是什么。我从文本文件中获取十六进制地址,然后将它们转换为 unsigned long long int。我正在尝试创建一个大小为 1000 的散列 table,那么当我划分这些 long long 整数时,我到底得到了什么?我不太明白这一点。
输入文件包含这样的行:
0x7f1a91026b00
0x7f1a91026b03
0x7f1a91027130
0x7f1a91027131
0x7f1a91027134
0x7f1a91027136
到目前为止,这是我的代码(我目前还没有创建哈希 [=18=],因为我没有哈希函数)
#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;
现在 y 将在 [0, 0x1000)
的范围内。这基本上是通过从 x
中减去 0x1000
直到它小于 0x1000
.
来完成的
因此,如果您希望散列 table 大小为 1000,那么您需要获得 0x3E8 的模,例如 0x7f1a91026b00 % 0x3e8 = 0x20。这代表 12 月的 32
十六进制 0x3e8 = 1000 年 12 月。
我正在尝试创建一个存储十六进制的散列函数,但我不确定该散列函数是什么。我从文本文件中获取十六进制地址,然后将它们转换为 unsigned long long int。我正在尝试创建一个大小为 1000 的散列 table,那么当我划分这些 long long 整数时,我到底得到了什么?我不太明白这一点。
输入文件包含这样的行:
0x7f1a91026b00
0x7f1a91026b03
0x7f1a91027130
0x7f1a91027131
0x7f1a91027134
0x7f1a91027136
到目前为止,这是我的代码(我目前还没有创建哈希 [=18=],因为我没有哈希函数)
#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;
现在 y 将在 [0, 0x1000)
的范围内。这基本上是通过从 x
中减去 0x1000
直到它小于 0x1000
.
因此,如果您希望散列 table 大小为 1000,那么您需要获得 0x3E8 的模,例如 0x7f1a91026b00 % 0x3e8 = 0x20。这代表 12 月的 32
十六进制 0x3e8 = 1000 年 12 月。