我将无序地图定义为(在有序地图中):
std::map<xxx, std::unordered_map <Key, Data,Hasher, Equals>> umap_;
哈希函数基本上是fnv:
static inline size_t
hash (const void *data_ptr, int len)
{
.....
return hv % 0xffffffff;
}
插入操作如下:
std::pair<
std::unordered_map<Key,Data,Hasher, Equals>::itr,
bool> ret;
ret = umap_[xxx].insert(
std::pair<Key, Data>(key, data));
我所看到的是,在某些情况下,即使生成的散列是唯一的,插入也会失败。当我检查返回迭代器时,它有一些键,它插入了一个完全不同的哈希值。
我在这里缺少什么?是否与正在生成的32位散列有关,并且它无法使用我的无序映射hs表
谢谢!
添加hasher和比较器
struct Hasher
{
std::size_t operator()(const Key& k) const
{
return k->Hash();
}
};
struct Equals {
bool operator() (const Key& left, const Key& right) const
{ return !(left->Comp(*right)); }
};
Hash()是类中的虚函数:
class <blah> : public <blah> {
protected:
uint32_t slotNum;
public:
.....
.....
virtual bool Comp(const Key& in) const
{
...
if (slotNum != in.slotNum) { return (slotNum < in.slotNum); }
return (FALSE);
}
virtual size_t Hash() const
{
....
hash32 = hash(key_data_buffer, key_size);
return hash32;
}