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

当我自己尝试这个时,结果总是有大致相同的位数。

4

3 回答 3

5

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

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

于 2013-04-15T18:14:36.813 回答
4

你看过 std::hash 吗?

http://en.cppreference.com/w/cpp/utility/hash

于 2013-04-15T18:13:05.850 回答
1

这是做不到的。假设您int是 32 位的。一个文本字符串将由和半打标点字符组成,总共大约 1 + 2*26 + 10 + 6 = 69 个字符' '。对于 6 个字符的字符串,您已经拥有比整数值更多的可能字符串 (log(2^32)/log(69) = 5.23)。使用64 位,你已经用完了 11 个字符。a-zA-Z0-9long long

正如其他答案所说,您可以使用散列函数(有很多浮动),它将字符串映射到整数并(希望)将它们平均分布在选定的整数范围内。

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

如果在程序中使用它,并且字符串可以由攻击者控制,那么您将受到算法复杂性攻击(攻击者可以用碰撞的字符串淹没您)。

于 2013-04-15T19:04:57.323 回答