使用GCC 4.4(通常是Android和IOS可用的最大版本),是否有一种方法可以对字符串进行编译时哈希处理。
我们有一个资源管理器,将字符串键映射到资源。虽然查找很快,但哈希和字符串创建较慢。类似于:
ResourcesManager::get<Texture>("someKey");
花费大量时间来分配字符串“someKey”,然后进行哈希。
我想知道是否有一个技巧可以在编译时进行哈希处理。
使用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"
};
您可以随时编译一个程序来哈希您的字符串并输出适当的源代码...
我个人不会实际哈希字符串,我只是枚举项目并输出具有枚举的头文件。非常简单易行,没有冲突等。
get
函数的参数类型是什么?为了避免分配内存,请使用char const*
。 - James McNellisenum
)呢? - smockingResourcesManager::get<Texture>(Resources::SomeKey)
。 - mfontanini