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

2024-02-05

通常,数据驱动设计中的实体和组件或游戏代码的其他部分都会有名称,如果您想准确地找出正在处理的对象,则需要检查这些名称。

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

如果您忽略这可能是过早优化的可能性,那么很明显,如果实体的“名称”是一个简单的 32 位值而不是实际的字符串,则查找实体会快得多。

从字符串名称中计算哈希值是一种可能的选择。我实际上还没有尝试过,但是有了 32 位的范围和良好的散列函数,冲突的风险应该是最小的。

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

假设我们使用 C++ 并且想要替换代码中出现的所有字符串,这是否可以通过语言内置的功能来实现,或者我们是否必须构建一个外部工具来手动查看所有文件并交换值?


杰森格雷戈里写了这个his book http://www.gameenginebook.com/ :

在 Naughty Dog,我们使用了 CRC-32 算法的变体来对字符串进行哈希处理,并且在《神秘海域:德雷克的财富》的两年多开发过程中,我们没有遇到任何冲突。

所以你可能想调查一下。

关于你提到的构建步骤,他也谈到了。它们基本上封装了需要散列的字符串,如下所示:

_ID("string literal")

并在构建时使用外部工具对所有出现的情况进行哈希处理。这样您就可以避免任何运行时成本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用整数哈希替换字符串名称有哪些好方法 的相关文章

随机推荐

  • 如何使用QVector at或operator[]来获取指向元素的指针

    我很想得到一个指向QVector元素 这样我就可以在其他地方使用该对象 但是at 方法给了我一个const T 值和operator 给我一个T value 我对如何使用它们来获取指针感到困惑 以便我将使用相同的对象而不是使用复制构造函数
  • 如何在 Linux 中列出文件的前 10 行或后 10 行而不解压文件 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个 bz2文件 我想列出前 10 行或后 10 行而不解压缩它 因为它太大了 我尝试过head 10 or tail 10但我看到的是胡言乱语
  • git rebase时进入vim时如何开始打字? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 使用 Powershell 5 时 当我键入git rebase i
  • 在android中集成javascript[重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 警报在 Android WebView 中不起作用 https stackoverflow com questions 5271898 javascript alert not
  • HeartBleed python 测试脚本

    我碰到这个Python脚本 https gist github com takeshixx 10107280测试服务器是否存在 HeartBleed 漏洞 有人能够解释 你好 的内容 正在发送的内容以及该内容是如何构造的吗 我并不是想恶意使
  • 无法写入请求:找不到适合请求类型和内容类型的 HttpMessageConverter [application/x-java-serialized-object]

    我正在尝试向第三方服务器发送 xml 请求并期待返回 xml 响应 我在这里附上用于配置 Cnfiguration 网关和通道 自定义 Rest 模板类和要执行的测试客户端的源代码 我们有各种用于 XML Posting 的消息转换器 但尽
  • 如何在 iOS 上获取 Cognito 用户池“sub”属性

    我正在使用 Cognito 用户池授权者 无 AWS IAM 选项 无自定义编码授权者 通过 API 网关调用 Lambda 方法并识别登录 iOS 客户端的用户 在 Lambda 上 我使用从 Cognito 用户池授权者处获得的用户 I
  • 如何在 PL/pgSQL IF 语句中运行 SELECT 查询

    我正在尝试使用以下代码在 PL pgSQL IF 语句中运行 SELECT 查询 DO do DECLARE query type real arr real array 1 BEGIN IF query type 1 THEN RETUR
  • Javascript匿名函数不更新全局变量

    我在一些代码中进行了 getJSON 调用 该调用似乎没有更新全局变量 但我不明白为什么 JSON 数据加载正常 但由于某种原因 全局 EventOptions 数组未在 for 循环中更新 大写的注释指的是变量 有任何想法吗 谢谢 fun
  • 无法在外键上创建表(错误号:150)

    我看到很多同样的问题 但我无法解决我的问题 如果我运行这段代码
  • 如何设置 thymeleaf th:来自其他变量的字段值

    我有一个简单的文本输入字段 我必须在其中设置一个对象的默认值并将其最终值保存在其他对象中 以下代码不起作用 div div
  • 简单的分布式 Erlang

    我有一个简单的模块 module dist compile add 3 add From X Y gt From X Y 我正在启动两个节点 一与 erl sname foo 另一个与 erl sname bar 在我正在做的酒吧节点上 g
  • 速度较慢的 numpy.argmax/argmin 的更快替代方案

    我正在使用很多argmin and argmax在Python中 不幸的是 该功能非常慢 我已经做了一些搜索 我能找到的最好的就在这里 http lemire me blog archives 2008 12 17 fast argmax
  • Firefox 4中的Greasemonkey脚本,想更改网页上的一行代码

    好吧 我会尽量让这件事变得尽可能简单 但不会太含糊 我想更改网页上的一行代码 以防止出现预览窗格 原始代码行 div class previewpane 我想将上面的行替换为 div class previewpane previewpan
  • 文件加密与内容加密不同吗

    加密文件和加密文件内容之间有什么区别吗 如果是这样 两者该如何做 文件加密是从外部加密整个文件 例如通过在 Windows XP 资源管理器中右键单击 内容加密通常被用作文件加密的同义词 但两者是不同的 内容加密是指对文件的内容进行加密 或
  • Pandas 合并错误:MemoryError

    Problem 我正在尝试将两个相对较小的数据集放在一起 但合并会引发MemoryError 我有两个国家贸易数据汇总数据集 我试图将其合并到关键年份和国家 地区 因此需要对数据进行特殊设置 不幸的是 这使得使用concat正如这个问题的答
  • 理解非齐次 numpy 数组

    我最近开始使用 numpy 并注意到一件奇怪的事情 import numpy as np a np array 1 2 3 4 5 9 8 print a shape shape print a 1 0 在这种情况下 形状是2L 但是 如果
  • 从 awk 调用 python 脚本

    大多数解决方案都从 python 调用 awk 但我想反过来做 我有一个从文件中提取信息的 python 脚本 然而 所述文件名在 awk 脚本的列中引用 如何向 python 传递参数 s20s 文件名并从标准输出获取输入 我想将输出添加
  • 填充嵌入的 UITableViewController

    我有一个使用导航控制器的应用程序 在其中一个视图中 我有一个视图容器 其中嵌入了使用静态单元格的 UITableViewController 我需要使用从上一个视图传入的数据来填充此表视图控制器的标签 流程如下 View1 gt segue
  • 用整数哈希替换字符串名称有哪些好方法

    通常 数据驱动设计中的实体和组件或游戏代码的其他部分都会有名称 如果您想准确地找出正在处理的对象 则需要检查这些名称 void Player Interact Entity myEntity if myEntity gt isNearEno