我试图测试xxhash函数。于是我写了一个简单的程序,生成UUID并将其传递给XXH32
函数。下面是我的程序:uuid_generate_random当发生1000万UUID时崩溃
#define UUID_LEN 36
int main(int argc, char **argv)
{
uuid_t id;
char cid[UUID_LEN + 1];
int hash_count = atoi(argv[1]);
unsigned int hash[hash_count];
for(int i = 0;i < hash_count;i++) {
uuid_generate_random(id);
uuid_unparse(id, cid);
hash[i] = XXH32(cid, UUID_LEN, time(NULL));
uuid_clear(id);
}
return 0;
}
我通过哈希生成的数量作为参数(./main 100
)。程序工作正常,但当我通过100万它显示:Segmentation fault (core dumped)
。我安装了所有的debuginfo软件包。当我打开core文件gdb
它表明:
Reading symbols from /home/m.azimi/projects/testtommy/main...done.
[New LWP 8117]
Core was generated by `./main 10000000'.
Program terminated with signal 11, Segmentation fault.
#0 0x00000000004008e0 in main (argc=2, argv=0x7fffe19da598) at main.c:19
19 uuid_generate_random(id);
我uuid_generate
这不利于试过。我使用完全更新的软件包的Fedora 19。您可以从here下载核心文件。
[更新]
基于@Tarik评论我改hash[i % 10000] = XXH32(cid, UUID_LEN, time(NULL));
和现在是工作的罚款。此外,我只保存生成的整数哈希值。所以内存使用量是10,000,000 * 4字节= 40MB。接下来,我改变了计划,以这样的:
int main(int argc, char **argv)
{
/* allocate 10 million 4byte chunk = 40MB */
unsigned int hash[10000000];
return 0;
}
这也与核心崩溃:
[New LWP 13593]
Core was generated by `./main'.
Program terminated with signal 11, Segmentation fault.
#0 0x000000000040068b in main (argc=<error reading variable: Cannot access memory at address 0x7fff244a388c>,
argv=<error reading variable: Cannot access memory at address 0x7fff244a3880>) at main.c:9
9 {
新的核心文件可以从here下载。为什么这会发生?是否有任何操作系统级别限制?这是从堆栈而不是堆分配内存吗?因为unsigned int *hash = (unsigned int *) malloc(sizeof(unsigned int) * 10000000);
没有问题。
什么是'XXH32'?顺便说一句,uuid需要32个字节而不是36. – alk
@alk'uuid_unparse'手册页说:uuid_unparse函数将提供的UUID从二进制表示转换为一个36字节的字符串(加上尾部的'\ 0')形式1b4e28ba-2fa1-11d2-883f-0016d3cca427。 'XXH32'是'xxhash'库中的散列函数。我用'UUID'的字符串表示来喂它。 –
呃,是的,你是对的,我忘了破折号。 – alk