字符串与散列作为映射键 - 性能

时间:2015-01-17 15:04:18

标签: c++ string dictionary hash

目前正在为我的游戏引擎编写日志系统。

为了保持一切清晰,我必须为每个Logger对象命名。 Logger对象存储在LogManager类中,该类跟踪每个Logger实例。 Map存储指向Logger实例的指针,因为键是使用std :: string来表示名称。

我正在开发实时3D引擎,因此减少latecny非常重要。 所以我想到了存储它的第二种方法 - 使用快速哈希算法(例如MurMur Hash 3)并且只存储64位哈希而不是字符串。

现在,我的问题是:使用哈希而不是字符串因为映射键值在运行时性能更好(在我和全局情况下)?

@Edit访问代码

    std::map<std::string, CLogger*> map1;
std::map<QWORD, CLogger*> map2;

// access :
CLogger * logger = map1["root"];
CLogger * logger = map2[getHashedString("root")];

//

QWORD getHashedString(const std::string string)
{
    QWORD val = 0;
    hash_x64_128(string.c_str(), string.length(), 1234, &val);
    return val;
}

上面使用的算法是MurMur Hash 3(https://code.google.com/p/smhasher/source/browse/branches/chandlerc_dev/MurmurHash3.cpp

最诚挚的问候。

2 个答案:

答案 0 :(得分:1)

Definitly。但请确保生成的哈希码是唯一的。性能提升还取决于您使用的地图实现。例如,stl::map使用搜索树来存储密钥。在这种情况下,您可以节省大量的字符串比较。如果您使用的是stl::unordered_map,则会获得更少的收益,因为它已经使用了哈希值。但是如果巧妙地做到这一点,你仍然可以在哈希计算上保存一些运行时。

非常重要的一点:在优化之前和之后测量运行时间;)

答案 1 :(得分:0)

你能提供一些访问地图的代码吗?

计算自己的哈希值和让访问者计算哈希值之间的区别在于,可能通过使用自己的哈希值,map的Hash参数成为身份函数。