type
status
date
slug
summary
tags
category
icon
password
在游戏开发中,一些资源、事件等行为通常伴随着String,(const char*)→(std::string)常常伴随着std::string,会在堆上频繁地构造和释放空间,在性能上远不如使用int类型的id快,int只需要在寄存器和栈上传递。
这里的StringID分为两种,编译期间和运行期间。游戏中一些事件和资源路径的StringID就适合用编译期去实现,通常用FNV哈希(如CryEngine);而运行期间更适合用于运行时候的大规模的资源加载。
首先讲讲FNV哈希的实现。
FNV哈希全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出。FNV有三个版本,FNV-0(已弃用),FNV-1,FNV-1a。FNV-1和FNV-1a的实现区别是前者先乘法在做异或,后者先做异或再做乘法。
FNV的核心是给定一个offset(FNV-0中OFFSET是0)和PRIME,使用offset对字符串的每一位进行异或,然后乘以一个PRIME,以此不断递归对整个字符串进行操作。
下面是FNV-1a的具体实现
- Author:lltouchingfish
- URL:https://tangly1024.com/article/251be847-332a-8017-826d-da16ae346ad6
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts