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
開始撰寫遊戲程式系列文的預訂日無限推延中...