你如何初始化一个散列 Table 以存储在 C 中的文件中
How Do You Initialize a Hash Table to Store in a File in C
我正在尝试使用线性探测在 C 中实现固定大小的散列 table 以解决冲突。此散列 table 将存储在一个文件中,供以后(和快速)通过生成的散列值检索。我已经解决了大部分问题,但我似乎一直在初始化我将要使用的 table。我认为使用我正在注册的结构类型的数组,然后将所有值初始化为 NULL 或空白“”是可行的方法,但现在我不太确定。
我也不确定检索过程将如何进行。我还没有在网上找到任何有用的资源来描述 C 语言。当检索特定索引的信息时,我是否需要将整个哈希 table 加载到内存中(这似乎不切实际)或者是否有一种方法可以加载特定索引的内容(可能使用 lseek 来定位正确的文件位置)?
我只包括与散列 table 初始化相关的代码,但如果您需要更多,请告诉我。提前致谢:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define HSZ 10
struct client{
char last_name[80];
char maiden_name[80];
char name[80];
}client;
void init_array(){
int fd, i;
int bucket_no = 0;
struct client buff;
if ((fd = open("output", O_RDWR|O_CREAT,0777))<0){
perror("Inside init function: ");
printf("There was a problem initializing the hash table!");
}
for (i = 0; i<HSZ; i++){
strcpy(buff.name,"_");
strcpy(buff.last_name,"_");
strcpy(buff.maiden_name,"_");
lseek(fd, sizeof client * bucket_no, SEEK_SET);
write(fd, &buff, sizeof client);
bucket_no++;
}
close(fd);
}
您可以使用 mmap
。它基本上允许您像访问数组一样访问文件。
struct stat s = stat(filename, &s);
size_t size = s.st_size;
int fd = open(filename, O_RDONLY, 0);
struct client *map = mmap(NULL, size, PROT_READ, fd, 0);
虽然 mmap()
可能是最简单的方法,但只要每个桶都像您的示例中那样是固定大小,就很容易计算出在读取给定文件之前要在文件中查找的偏移量 - 或者使用 pread()
.
将两个步骤合二为一
类似
int bucket_number = 4; // 0 based like an array
struct client bucket;
lseek(hash_fd, sizeof bucket * bucket_number, SEEK_SET);
read(hash_fd, &bucket, sizeof bucket);
或
pread(hash_fd, &bucket, sizeof bucket, sizeof bucket * bucket_number);
对于将存储桶写入文件,使用 write()
或 pwrite()
对单个存储桶使用相同类型的数学运算 - 或者在创建文件时一次写入整个数组的值。
我正在尝试使用线性探测在 C 中实现固定大小的散列 table 以解决冲突。此散列 table 将存储在一个文件中,供以后(和快速)通过生成的散列值检索。我已经解决了大部分问题,但我似乎一直在初始化我将要使用的 table。我认为使用我正在注册的结构类型的数组,然后将所有值初始化为 NULL 或空白“”是可行的方法,但现在我不太确定。
我也不确定检索过程将如何进行。我还没有在网上找到任何有用的资源来描述 C 语言。当检索特定索引的信息时,我是否需要将整个哈希 table 加载到内存中(这似乎不切实际)或者是否有一种方法可以加载特定索引的内容(可能使用 lseek 来定位正确的文件位置)?
我只包括与散列 table 初始化相关的代码,但如果您需要更多,请告诉我。提前致谢:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define HSZ 10
struct client{
char last_name[80];
char maiden_name[80];
char name[80];
}client;
void init_array(){
int fd, i;
int bucket_no = 0;
struct client buff;
if ((fd = open("output", O_RDWR|O_CREAT,0777))<0){
perror("Inside init function: ");
printf("There was a problem initializing the hash table!");
}
for (i = 0; i<HSZ; i++){
strcpy(buff.name,"_");
strcpy(buff.last_name,"_");
strcpy(buff.maiden_name,"_");
lseek(fd, sizeof client * bucket_no, SEEK_SET);
write(fd, &buff, sizeof client);
bucket_no++;
}
close(fd);
}
您可以使用 mmap
。它基本上允许您像访问数组一样访问文件。
struct stat s = stat(filename, &s);
size_t size = s.st_size;
int fd = open(filename, O_RDONLY, 0);
struct client *map = mmap(NULL, size, PROT_READ, fd, 0);
虽然 mmap()
可能是最简单的方法,但只要每个桶都像您的示例中那样是固定大小,就很容易计算出在读取给定文件之前要在文件中查找的偏移量 - 或者使用 pread()
.
类似
int bucket_number = 4; // 0 based like an array
struct client bucket;
lseek(hash_fd, sizeof bucket * bucket_number, SEEK_SET);
read(hash_fd, &bucket, sizeof bucket);
或
pread(hash_fd, &bucket, sizeof bucket, sizeof bucket * bucket_number);
对于将存储桶写入文件,使用 write()
或 pwrite()
对单个存储桶使用相同类型的数学运算 - 或者在创建文件时一次写入整个数组的值。