用整数哈希替换字符串名称有什么好方法

Tra*_*isG 8 c++ string

通常,数据驱动设计中的实体和组件或游戏代码的其他部分将具有检查的名称,如果您想要找出您正在处理的对象.

void Player::Interact(Entity *myEntity)
{
    if(myEntity->isNearEnough(this) && myEntity->GetFamilyName() == "guard")
    {
       static_cast<Guard*>(myEntity)->Say("No mention of arrows and knees here");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你忽略了这可能是过早优化的可能性,很明显,如果他们的"名称"是一个简单的32位值而不是实际的字符串,查找实体将会快得多.

计算字符串名称中的哈希值是一种可能的选择.我实际上没有尝试过,但是在32bit的范围和良好的散列函数下,碰撞的风险应该是最小的.

问题是:显然我们需要某种方法将代码内(或某种外部文件中)字符串名称转换为那些整数,因为处理这些命名对象的人仍然希望将对象称为"守卫" "而不是"0x2315f21a".

假设我们正在使用C++并希望替换代码中出现的所有字符串,这是否可以通过语言内置功能实现,还是我们必须构建一个外部工具来手动浏览所有文件并交换值?

Dav*_*eia 10

杰森格雷戈里在他的书上写道:

在Naughty Dog,我们使用了CRC-32算法的变体来对我们的字符串进行哈希处理,并且在Uncharted:Drake's Fortune的两年多的开发中我们没有遇到过一次冲突.

所以你可能想要研究一下.

关于你提到的构建步骤,他也谈到了它.它们基本上封装了需要在以下内容中进行哈希处理的字符串:

_ID("string literal")
Run Code Online (Sandbox Code Playgroud)

并在构建时使用外部工具来散列所有出现的内容.这样可以避免任何运行时成本.

  • 在 C++11 中,您应该能够使用 `constexpr` 函数在编译时进行散列,无需外部工具。 (2认同)