gpt4 book ai didi

c++ - 字符串的双向 "Hashing"

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:36 28 4
gpt4 key购买 nike

我想从字符串生成 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 位哈希值代表超过 40 亿个可能的值。因此,如果我们的哈希函数能够很好地在这个非常大的范围内均匀分布字符串,我们就不太可能碰撞。在 Naughty Dog,我们使用了 CRC-32 算法的变体来散列我们的字符串,在开发《神秘海域:德雷克的财富》两年多的时间里,我们没有遇到任何一次碰撞。”

最佳答案

将任意长度的字符串缩减为固定大小的 int 在数学上是不可能逆转的。参见 Pidgeonhole principle .字符串的数量几乎是无限的,但只有 2^32 个 32 位整数。

32 位哈希(假设您的 int 是 32 位)很容易发生冲突。所以它也不是一个好的唯一 ID。

哈希函数允许您使用预定义的哈希创建消息,但它很可能不是原始消息。这称为 pre-image .

对于您的问题,看起来最好的办法是创建一个将整数 ID 映射到字符串并返回的字典。


要了解散列 n 个字符串时发生冲突的可能性,请查看 the birthday paradox .该上下文中最重要的属性是,一旦散列消息的数量接近可用散列值数量的平方根,就可能发生冲突。因此,如果您对 65000 个字符串进行哈希处理,则 32 位整数可能会发生冲突。但如果你运气不好,它可能会发生得更早。

关于c++ - 字符串的双向 "Hashing",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7947049/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com