如何在C++中从字符串生成唯一的无符号整数?

6

我不需要代码(如果您愿意,可以提供代码示例),但我希望了解其中的理论。

假设我有以下函数:

UINT GenerateID(const char * string);

我希望函数的结果看起来完全随机。我知道它不可能是唯一的,但这是我能解释我的愿望的最好方式。

GenerateID("123"); //Could result in 999
GenerateID("123"); //Must also result in 999
GenerateID("124"); //Should result in something completely different

当我自己尝试时,结果的数字总是大致相同。


1
看起来你正在寻找一个哈希函数 - Eddy Luten
3个回答

5

您正在寻找一个哈希函数。哈希函数接收任意长度的输入并将其转换为唯一的数字(通常是十六进制)。

请查看此页面以查看SHA-1哈希如何工作的示例:http://hash.online-convert.com/sha1-generator


4

1
这是不可能完成的。假设为了论证而言,您的int是32位。一个文本字符串将由' 'a-zA-Z0-9以及半打标点符号字符组成,总共约为1 + 2*26 + 10 + 6 = 69个字符。对于长度为6个字符的字符串,您已经拥有比整数值更多的可能字符串(log(2^32)/log(69) = 5.23)。使用64位的long long,您在11个字符处就会用完。
正如其他答案所说,您可以使用哈希函数(有很多浮动),它将把字符串映射到整数,并(希望)平均分布在所选整数范围内。
有一些技术可以构建完美哈希函数,对于一个固定的字符串集合,它们可以制作出一个函数和一个不太大的范围,保证没有冲突(没有两个字符串给出相同的整数)。
如果这个程序中的字符串可以被攻击者控制,那么你就会面临算法复杂度攻击(攻击者可以用相互冲突的字符串淹没你)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接