我不需要代码(如果您愿意,可以在代码中提供示例),但我想要理论。
让我假装我有以下功能:
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
自己尝试时,结果的数字总是大致相同。
答案 0 :(得分:5)
您正在寻找哈希函数。哈希函数接受任意长度的输入并将其转换为唯一的数字(通常为十六进制)。
查看此页面,了解SHA-1哈希如何工作的示例:http://hash.online-convert.com/sha1-generator
答案 1 :(得分:4)
你看过std :: hash吗?
答案 2 :(得分:1)
这不可能。假设为了论证你的int
是32位。文本字符串将由' '
,a-zA-Z
和0-9
以及半打标点字符组成,总共大约1 + 2 * 26 + 10 + 6 = 69个字符。对于6个字符的字符串,您已经拥有比整数值更多的可能字符串(log(2 ^ 32)/ log(69)= 5.23)。使用64位的long long
,你已经用完了11个字符。
正如其他答案所说,你可以使用hash function(周围有很多浮动),它会将字符串映射到整数,并且(希望)在所选的整数范围内均匀地传播它们。
有一些技术可以构建完美哈希函数,对于固定的字符串集来说,它可以创建一个函数和一个不太大的范围来保证不会发生冲突(没有两个字符串给出相同的整数。)
如果在程序中使用它,并且攻击者可以控制字符串,则会受到algorithmic complexity attacks的攻击(攻击者可以使用碰撞的字符串淹没你)。