[程式] 字串ID (String ID, SID)

楼主: cjcat2266 (CJ Cat)   2016-08-29 08:35:49
String ID (SID)是开发游戏常用到的工具
主要是当作在游戏中存取素材(asset look-up)的钥值(key)
基本上就是把字串用杂凑值取代
最近开始计画撰写游戏程式系列文
对SID的需求迅速演变成一个独立专案...
https://github.com/TheAllenChou/string-id
主要的好处有:
- 每个SID使用的内存量是固定的(取决于杂凑值的型别)
- SID之间的比较是constnat-time
- 一般用SID当作存取素材的key比用字串当key有效率
- SID若实作成编译时期常数,则可以用作switch case,字串则不行
- 动态将SID串接字串生成新的SID是linear-time,且不需要原SID之对应字串
主要的坏处与解决方式:
- SID较难除错,因为其本质是杂凑值
一般的做法是另外做个数据库,储存SID与对应字串的对照表
然后再做个debugger外挂,让watch window显示对应字串
有了这些应变措施之后,SID除错起来就跟一般字串没两样
- 因为SID是杂凑值,会有两个字串产生相同SID的可能性(杂凑碰撞, hash collision)
遇到这种状况,要嘛额外实作解决杂凑碰撞的机制,要嘛改变其中一个字串
杂凑函示选择恰当和运气好的话,杂凑碰撞的机率不高
(公司十年来还没碰过SID杂凑碰撞,所以一直还没有实作解决方式XD)
我的SID专案进度是已经有可以实用的SID
但是还在开发除错用的数据库和debugger plugin
开始撰写游戏程式系列文的预订日无限推延中...
作者: cowbaying (是在靠北喔)   2016-08-29 09:31:00
碰撞问题在高速计算的应用程式比较容易遇到资料低于1亿笔(我推测的)的情下应该不需要担心 XD
楼主: cjcat2266 (CJ Cat)   2016-08-29 10:28:00
我论所有游戏公司其实都没有实作解决碰撞 :/SID数据库写好了,下一步是VS debugger plugin
作者: pttworld (批踢踢世界)   2016-08-29 21:45:00
内存加载,对于每一句就会有SID加本文。另外请益那一种类型的游戏需要字串比较。
楼主: cjcat2266 (CJ Cat)   2016-08-29 23:17:00
素材存取就会去比较key了呀还是你是指strcmp这种lexicographical比较?一般只要有字串排序或等值比较就会用到了
作者: pttworld (批踢踢世界)   2016-08-29 23:26:00
对的,我指的是两字串间比较这个。
楼主: cjcat2266 (CJ Cat)   2016-08-30 02:50:00
就算不做lexicographical排序,等值比较还是用strcmp所以基本上只要检查字串是否相同,就算是在比较了这方面SID就比较有效率,因为只是比较整数而已
作者: y3k (激流を制するは静水)   2016-08-30 07:23:00
这种Resource Key的东西 不是都应该在产生的时候计算重复问题吗?XD
楼主: cjcat2266 (CJ Cat)   2016-08-30 08:39:00
我们的做法是debug版本产生的时候跟数据库确认
作者: cowbaying (是在靠北喔)   2016-09-05 13:41:00
其实我这几天发现 OS本身就有一个SID系统所以这个部分应该是可以直接应用的?
作者: manaup   2016-09-08 19:36:00
明明就有uuid让你用 https://en.wikipedia.org/wiki/uuid
作者: cowbaying (是在靠北喔)   2016-09-08 20:53:00
好像就是这个 XDDDD
楼主: cjcat2266 (CJ Cat)   2016-09-09 06:51:00
就我所知UUID没有O(n)的string concat功能吧这功能蛮重要的,因为游戏常需要动态生成字串串接的SID然后只要原SID就好,不需要另外保存对应的原始字串我不太熟悉一般把字串对应到UUID会怎么做目前找不到类似把字串hash成UUID的讨论还是说是每遇到一个新字串,就生成一个UUID加到数据库?这样的话用字串当key去找对应的UUID是O(n*log(n))?
作者: cowbaying (是在靠北喔)   2016-09-09 13:42:00
这个要详加研究一下了 囧
楼主: cjcat2266 (CJ Cat)   2016-09-10 00:04:00
另外如果真的没有string->UUID的hash function那这样就做不到build-time constant和switch cases了其实可以啦,就是要用个自制preprocessor处理一遍不过还是没办法像SID macro这样所见及所得总之需求是可以串接字串的compile-time constant杂凑若真有string->UUID hash,那也就只是多一个hash选择把我的SID范例里面的FNV hash改掉而已,其他不变啊,看来UUID v4标准说除了版本位元以外,其他随意所以就只要找个122-bit杂凑函式就解决了这样其实就是同一件事情,也不用硬要跟UUID搭关系了...自言自语一大串,到头还是是要有个string->SID hash我想也不用刻意把hash结果跟UUID做关联,豁然开朗 @.@啊,UUID v5也就只是把SHA-1切成128bit也去除了特殊位元,所以只要个128bit hash就可以了这样跟SID其实是同一件事情嘛...
作者: cowbaying (是在靠北喔)   2016-09-10 02:26:00
XD

Links booklink

Contact Us: admin [ a t ] ucptt.com