我正在编写一个模板类,它调用一个哈希函数,该函数将一个指向对象和该对象大小的指针作为参数。
例如,如果item
的类型为int
,则呼叫将为
MurmurHash2(&item, sizeof(item), seed);
但如果item
是std::string
,我们就必须这样做
MurmurHash2(item.c_str(), item.size(), seed);
编写此代码的最简洁方法是什么,以便它可以处理尽可能多的类型?
答案 0 :(得分:5)
你的解决方案存在固有的缺陷,你不能通过指向对象的开头和对象的大小来创建一个哈希函数,并期望它能够工作。考虑一个简单的类型和两个变量:
struct T {
char ch;
int i;
} a = { 'a', 1 }, b = { 'a', 1 };
在我当前的平台上(我想在大多数平台上),sizeof(T) == 8
只有5个字节是对象的值的一部分,其他3个是填充。填充中的字节值不保证具有任何值,并且它们在a
和b
中可能会有所不同,即使这两个对象具有相同的值。
答案 1 :(得分:0)
一种可能的解决方案:使用Boost.Serialization之类的东西将对象转换为标准化的字节流,然后将其与大小一起传递给MurmurHash函数。