字符串的双向"哈希"

rel*_*xxx 5 c++ hash

我想从字符串生成int并能够生成它.类似哈希函数但是双向函数.我想在我的应用程序中使用int作为ID,但希望能够在记录或调试时将其转换回来.

喜欢:

int id = IDProvider::getHash("NameOfMyObject");

object * a = createObject(id);

...

if(error)
{
    LOG(IDProvider::getOriginalString(a->getId()), "some message");
}
Run Code Online (Sandbox Code Playgroud)

我听说过略微修改的CRC32快速且100%可逆,但我找不到它,我自己也无法写.

任何提示我应该使用什么?谢谢!

编辑 我刚刚创建了源代码我有完整的CRC32来自:

Jason Gregory:游戏引擎架构

报价:

"与任何哈希系统一样,冲突是可能的(即,两个不同的字符串可能最终使用相同的哈希码).但是,通过合适的哈希函数,我们可以保证所有合理的输入字符串都不会发生冲突我们可能会在我们的游戏中使用.毕竟,一个32位的哈希代码表示超过40亿个可能的值.所以如果我们的哈希函数在这个非常大的范围内很好地分配字符串,我们就不太可能发生冲突. Naughty Dog,我们使用了CRC-32算法的变体来对我们的字符串进行哈希处理,并且在Uncharted:Drake's Fortune的两年多的开发中我们没有遇到过一次冲突.

Cod*_*aos 19

将任意长度的字符串减少到固定大小的int在数学上是不可能反转的.参见Pidgeonhole原理.有几乎无限量的字符串,但只有2 ^ 32 32位整数.

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

有一些哈希函数允许您使用预定义的哈希创建一个消息,但它很可能不是原始消息.这称为前映像.

对于您的问题,最好的想法是创建一个将整数-id映射到字符串并返回的字典.


当你散列n个字符串时,为了获得碰撞的可能性,请查看生日悖论.该上下文中最重要的属性是,一旦散列消息的数量接近可用散列值的数量的平方根,就可能发生冲突.因此,如果您对大约65000个字符串进行散列,则可能会发生32位整数冲突.但如果你运气不好,它可能会更早发生.


Pup*_*ppy 16

我正是你需要的.它被称为"指针".在此系统中,"指针"始终是唯一的,并且始终可用于恢复字符串.它可以"指向"任何长度的任何字符串.作为奖励,它也具有与你的int相同的大小.您可以使用&操作数获取字符串的"指针" ,如我的示例代码所示:

#include <string>
int main() {
    std::string s = "Hai!";
    std::string* ptr = &s; // this is a pointer
    std::string copy = *ptr; // this retrieves the original string
    std::cout << copy; // prints "Hai!"
}
Run Code Online (Sandbox Code Playgroud)

  • 这有很多的问题:1)ID只能一个单一的过程中使用2)你需要保持串活足够长3)如果你申请这几个字符串相等内容明智的,但并不明智引用您获得不同的ID. (4认同)

小智 5

你需要的是加密。根据定义,散列是一种方法。您可以尝试简单的 XOR 加密以及一些值的加/减。

...以及更多通过谷歌搜索...