编译时哈希C++0x
Compile Time Hashing C++0x
使用GCC 4.4(通常是Android和IOS可用的最大值)可以在编译时对字符串进行哈希处理。
我们有一个资源管理器,它将字符串键映射到资源。虽然查找速度很快,但哈希和字符串创建速度很慢。类似于:
ResourcesManager::get<Texture>("someKey");
花费大量时间分配字符串"someKey",然后对其进行哈希。
我想知道是否有一个技巧可以用来在编译时对它进行散列。
您必须实现正确的哈希算法,但这可以使用C++11的constexpr函数:
#include <iostream>
// Dummy hashing algorithm. Adds the value of every char in the cstring.
constexpr unsigned compile_time_hash(const char* str) {
// Modify as you wish
return (*str == 0) ? 0 : (*str + compile_time_hash(str + 1));
}
int main() {
unsigned some_hash = compile_time_hash("hallou");
std::cout << some_hash << std::endl;
}
然后您可以有一个ResourcesManager::get
的重载,它取compile_time_hash
的结果(在这种情况下是一个无符号的)。
这显然取决于您所应用的哈希算法。使用constexpr实现类似SHA*的东西将非常痛苦。
请注意,您需要GCC>=4.6或clang>=3.1才能使用constexpr。
为了进行编译时哈希,所有键都需要是编译时常量。
使用编译时常量进行索引的常用方法不是使用字符串,而是使用枚举类型。这样做的优点是根本不需要散列,因为常数是顺序的,可以直接对数组进行索引。
enum KeyType
{
someKey,
someOtherKey
};
ResourcesManager::get<Texture>(someKey);
如果需要将键作为字符串获取,只需保留一个可以由枚举常量索引的字符串表。
static char * keyNames =
{
"someKey",
"someOtherKey"
};
您总是可以编译一个程序来散列字符串并输出合适的源代码。。。
就我自己而言,我实际上并不是在散列字符串,我只是枚举项目并用枚举输出一个头文件。漂亮简单,没有碰撞等。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- boost::包含提升单元的元组的哈希值
- 使用 Key 对 C++ 中的哈希映射进行排序. 无法排序
- C++中的并发哈希表
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 如何为位集找到/实现一个好的哈希函数
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 编译时哈希C++0x