【发布时间】:2011-12-18 07:45:58
【问题描述】:
我想从字符串生成 int 并能够将其生成回来。 类似于散列函数但双向函数的东西。 我想在我的应用程序中使用整数作为 ID,但希望能够在记录或调试时将其转换回来。
喜欢:
int id = IDProvider::getHash("NameOfMyObject");
object * a = createObject(id);
...
if(error)
{
LOG(IDProvider::getOriginalString(a->getId()), "some message");
}
听说CRC32稍作修改,速度快,100%可逆,但是找不到,自己也写不出来。
任何提示我应该使用什么? 谢谢!
编辑 我刚刚创建了我拥有整个 CRC32 的来源:
Jason Gregory:游戏引擎架构
引用:
“与任何散列系统一样,冲突是可能的(即,两个不同的字符串可能以相同的散列码结束)。但是,使用合适的散列函数,我们几乎可以保证不会发生冲突我们可能会在游戏中使用的合理输入字符串。毕竟,一个 32 位的哈希 chode 代表了超过 40 亿个可能的值。因此,如果我们的哈希函数能够很好地在这个非常大的范围内分配字符串,我们不太可能碰撞。在顽皮狗,我们使用 CRC-32 算法的变体来散列我们的字符串,在 Uncharted: Drake's Fortune 的两年多的开发中,我们没有遇到过一次碰撞。”
【问题讨论】:
-
这不是散列的意思。
-
你在说这个吗?只有 CRC32 的一种特殊情况是可逆的:stackoverflow.com/questions/1514040/reversing-crc32
-
no crc32 不会像你想的那样做,它的主要目的是检测位错误。
-
@SLaks 我知道散列是什么意思,但我找不到其他词。这就是为什么我使用引号,写
something like并使用术语two-way -
这不会给出一个 int,并且它不绑定到 C++,但是为了搜索,人们可能对 base64 编码感兴趣(例如在 bash 中,
echo whatever|base64给出d2hhdGV2ZXIK,它base64 -d解码回whatever)。