在c ++中从字符串生成唯一无符号整数的最佳方法是什么?

时间:2013-04-15 18:10:33

标签: c++ string int theory

我不需要代码(如果您愿意,可以在代码中提供示例),但我想要理论。

让我假装我有以下功能:

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

答案 2 :(得分: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个字符。

正如其他答案所说,你可以使用hash function(周围有很多浮动),它会将字符串映射到整数,并且(希望)在所选的整数范围内均匀地传播它们。

有一些技术可以构建完美哈希函数,对于固定的字符串集来说,它可以创建一个函数和一个不太大的范围来保证不会发生冲突(没有两个字符串给出相同的整数。)

如果在程序中使用它,并且攻击者可以控制字符串,则会受到algorithmic complexity attacks的攻击(攻击者可以使用碰撞的字符串淹没你)。