我需要生成大约N = 1亿个密钥的哈希密钥.从我的研究看来,murmur3(MurmurHash3_x86_32,见murmur3 hash)将是最快的散列函数,具有最佳延迟和足够小的碰撞率.我面临的问题是该函数返回键为 void *.更具体地说,模板是:
void MurmurHash3_x86_32 (const void *key, int len, uint32_t seed, void *out);
由于我的哈希表大小将小于它可以生成的最大哈希,我需要将它放入表范围[0,N-1].最简单的解决方案似乎是使用%运算符.但由于众所周知这是一个缓慢的操作员,我想知道是否有更快的方法来解决问题.
我发现一个有趣的建议是否有替代在C/C++中使用%(模数)?在StackOverflow本身.它暗示了"两个人的力量,以下作品(假设两个补语表示)":
return i & (n-1);
我的问题是,在较新的CPU上,它有时(或者大部分时间都是这样?),由于多路缓存线,性能会在大约2 ^ n,IIRC附近降低.(此链接提供有关插入大内存的说明,第3.5部分:Google sparsehash!).
目前,murmur3的优势似乎因硬件相关问题和%运营商的低效率而无效.由于性能是一个约束,我要求低延迟和更快的解决方案,即使它不是MurmurHash3_x86_32.
我对C++ 11 lambdas遇到的一些例子感到困惑.例如:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << []()->string{return "Hello World 1!";}() << endl;
[]{cout << "Hello World 2!" << endl;}();
string result = [](const string& str)->string {return "Hello World " + str;}("2!");
cout << "Result: " << result << endl;
result = [](const string& str){return "Hello World " + str;}("3!");
cout << "Result: " << result << endl;
string s;
[&s](){s = "Hello World 4!";}; // does not work
cout << s …Run Code Online (Sandbox Code Playgroud) 我正在研究wikibooks.org上的公共域实现.它实现了memmove(),如下明确声明它"不完全可移植"!我想知道为什么:
代码如下:
void *(memmove)(void *s1, const void *s2, size_t n)
{
char *p1 = s1;
const char *p2 = s2;
if (p2 < p1 && p1 < p2 + n) {
/* do a descending copy */
p2 += n;
p1 += n;
while (n-- != 0)
*--p1 = *--p2;
} else
while (n-- != 0)
*p1++ = *p2++;
return s1;
}
Run Code Online (Sandbox Code Playgroud) 我有一个大小为 100-200 GB 的文本文件。所以我希望以压缩格式存储(例如zip)。但是,由于其大小,我需要一次处理一行。虽然使用 一次一行读取文本文件很简单io.Source.fromFile(fileName).getLines,但这仅适用于解压缩的文件。
有没有一些有效的方法可以在scala中逐行读取压缩文件?我找不到任何示例,但我看到的更接近的实现是here,但它将文件加载到内存中。与通常给出的使用 zip 存档的示例不同,我只需要处理一个压缩的文本文件。如果有任何指示或线索,我将不胜感激。
C中的以下声明有什么区别?
static int foo(){}
int static foo(){}
据我所知,第一种格式在教科书中使用和订阅,而第二种格式似乎也可以使用.声明是否相同?
以下程序似乎没有按预期工作.'&&'具有比'||'更高的优先级,因此实际输出令人困惑.有谁能解释o/p吗?
#include <stdio.h>
int main(int argc, char *argv[])
{
int x;
int y;
int z;
x = y = z = 1;
x++ || ++y && z++;
printf("%d %d %d\n", x, y, z);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
实际输出为:2 1 1
TIA.
我看到在使用GCC的Linux系统上,字符串文字的地址似乎比其他变量小得多.例如,以下代码生成下面显示的o/p.
#include <stdio.h>
int main()
{
char *str1 = "Mesg 1";
char *str2 = "Mesg 2";
char str3[] = "Mesg 3";
char str4[] = "Mesg 4";
printf("str1 = %p\n", (void *) str1);
printf("str2 = %p\n", (void *) str2);
printf("&str3 = %p\n", (void *) str3);
printf("&str4 = %p\n", (void *) str4);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
str1 = 0x400668
str2 = 0x40066f
&str3 = 0x7fffcc990b10
&str4 = 0x7fffcc990b00
Run Code Online (Sandbox Code Playgroud)
这种用法是否有一个独立的地址空间?
我正在查看C99规范(N1256.pdf),其中说(第11506页):
const int *ptr_to_constant;
int *const constant_ptr;
Run Code Online (Sandbox Code Playgroud)
"ptr_to_constant指向的任何对象的内容不应该通过该指针修改,但是ptr_to_constant本身可以更改为指向另一个对象.同样,constant_ptr指向的int的内容可能会被修改,但是constant_ptr本身应该总是指向同一地点." (6.7.5.1指针声明符)
从我之前读到的内容来看,以下两个陈述产生了相同的行为.
int *const constant_ptr; /* This form is mentioned in the standard */
int const *constant_ptr; /* This form is NOT mentioned in the standard */
Run Code Online (Sandbox Code Playgroud)
我想知道第二种形式是正确的还是只是一种延伸.
在此先感谢,-S
以下代码具有异常行为,我发现它很奇怪.它只是一个以其他方式工作的程序的一部分.
#!/usr/bin/perl -w
use strict;
$a = 0;
$abc = 0;
exit 0;
Run Code Online (Sandbox Code Playgroud)
由于use strict语句Perl坚持我将第二个声明修改为:
my $abc = 0;
但它没有这样做$a!我在多个Linux发行版和Perl版本上试过这个.请问有人解释原因吗?
我想知道,根据C规范,如果给定的数据类型与预期的格式说明符不匹配,C中的预期行为是什么.例如:
printf("%lu\n", 2);
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用函数将C字符串转换为std :: string.该功能在64位上正常工作gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9).但是当我编译它-O2或-O3优化它时,会出现段错误.它适用于-O1.有人可以建议修复或解决这个问题吗?功能如下:
void make_name(unsigned const &i, string &h_file)
{
char h_str[10];
sprintf(h_str, "tmp/%09d.hb", i);
h_file = string(h_str);
}
Run Code Online (Sandbox Code Playgroud)