正在寻找C++不可变的hashset/hashmap
Looking for C++ immutable hashset/hashmap
我用大量的数据处理来处理GPL'ed C++代码。我们经常使用的一种特殊模式是收集一定数量(数千到数百万(的键或键/值对(通常为int32.int128(,将它们插入hashset/hashmap,然后在不进行进一步修改的情况下使用它。
我将其命名为不可变哈希表,尽管单赋值哈希表可能是更好的名称,因为我们在完全构建之前不使用它。
今天我们使用的是STL unordereded_map/set,但我们正在寻找一个更好(尤其是更快(的库。你能推荐一些适合这种情况的、与GPL兼容的许可证吗?
我认为最有效的方法是根据bucket num对所有密钥进行基数排序,并提供bucket->range映射,因此我们可以使用以下代码来搜索密钥:
bool contains (set,key) {
h = hash(key);
b = h % BUCKETS;
for (i : range(set.bucket[b], set.bucket[b+1]-1)
if (set.keys[i]==key) return true;
return false;
}
你对这种方法有什么看法?你能提出一种更快的方法来实现不可变的映射/集吗?
我认为,对于您的情况,Double Hashing或Robin Hood Hashing更合适。在许多可能的算法中,我更喜欢使用带有2^n表和奇数步的双哈希。这种算法非常高效且易于编码。以下只是uint32_t密钥的容器示例:
class uint32_DH {
static const int _TABSZ = 1 << 20; // 1M cells, 2^N size
public:
uint32_DH() { bzero(_data, sizeof(_data)); }
bool search(uint32_t key) { return *lookup(key) == key; }
void insert(uint32_t key) { *lookup(key) = key; }
private:
uint32_t* lookup(uint32_t key) {
uint32_t pos = key + (key >> 32) * 7919;
uint32_t step = (key * 7717 ^ (pos >> 16)) | 1;
uint32_t *rc;
do {
rc = _data + ((pos += step) & (_TABSZ - 1));
} while(*rc != 0 && *rc != key);
return rc;
}
uint32_t _data[_TABSZ];
}
相关文章:
- 正在寻找C++不可变的hashset/hashmap
- C# HashSet VS C++ std::unordered_set 使用自定义类键。C++慢...不可能。如何实现 C# 的速度?
- 如何将 int 放入 HashMap jni?
- 为什么调用 cout.operator<<(const char*) 打印地址而不是字符串? 如何创建一个函数本地静态"HashSet<char>"并初始化它一次?
- 在使用 JNI 将 c++ unordered_map转换为 java hashMap之前将其转换为 java hash
- 通过hashmap c 迭代
- Performance of C++ std::unordered_map vs Kotlin/Java HashMap
- C++Arduino:从hashmap添加和获取值会返回垃圾值
- 如何修复"Hashmap error: " C++错误
- 如何将 cocos2d ValueMap 作为 HashMap 发送到 Java
- 在C 中的自定义类的hashmap中的默认值
- 对类的模板(例如HashSet+HashMap)的签名进行条件检查
- 如何使用C++中的Hashmap在任意随机数组中找到所有求和为特定值的对
- DHCP指纹的HashMap实现
- tbb并发hashmap实现字典ADT
- 如何在C++中实现 HashMap 时使用 std::function
- C++中已经有为 LinkedList、HashMap、Tree 等编写的类
- 在hashmap中搜索,其中键可以是单个字符串或空格分隔的字符串
- C++将 HashMap<string、布尔>对象返回到 Java
- 复制C++中hashMap的构造