在我目前正在进行的项目中,我需要使用几个相对较短的字符串(例如“ABCD1234”)作为自定义容器的键。问题在于,此容器中的对象的类型可以说是“主键”是数字的。因此,我需要使用提供给我的唯一字符串,将它们转换为数字,并确保保留唯一性。
我一直在尝试使用boost::hash
,虽然我认为它会起作用,但我对哈希值最终变得太大感到恼火,尤其是考虑到我知道我将从短字符串开始。
是否可以使用另一个本机库或第三方库?这显然是一件方便的事,所以我不太担心,但是我想问一下。
最佳答案
您可以编写自己的代码,并返回一个简短的消息,但这很容易发生冲突。
这是我适应于返回一个short / 16位的代码。可能需要一些调整。
unsigned short hash( std::string const& s ) {
short results = 3;
for ( auto current = s.begin(); current != s.end(); ++ current ) {
unsigned char c = static_cast<unsigned char>( *current );
results = results + ((results) << 5) + *(c + i) + ((*(c + i)) << 7);
i++;
}
return ((results) ^ (results >> 16)) & 0xffff;
}
另外,如果您提前知道密钥是什么,并且密钥数量不多,则可以考虑使用完美的哈希
关于c++ - 将std::string散列到std::size_t之外的其他内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29171279/