C++ 将std::字符串散列为std::size\t以外的内容
作为我目前工作的项目的一部分,我需要使用几个相对较短的字符串(例如“ABCD1234”)作为自定义容器的键。问题是,这个容器中的对象属于其“主键”是数字的类型。因此,我需要将给定的唯一字符串转换为数字,并确保保留唯一性 我一直在尝试使用C++ 将std::字符串散列为std::size\t以外的内容,c++,boost,hash,C++,Boost,Hash,作为我目前工作的项目的一部分,我需要使用几个相对较短的字符串(例如“ABCD1234”)作为自定义容器的键。问题是,这个容器中的对象属于其“主键”是数字的类型。因此,我需要将给定的唯一字符串转换为数字,并确保保留唯一性 我一直在尝试使用boost::hash,虽然我认为它会起作用,但我对散列值最终有多大感到恼火,特别是考虑到我知道我将从短字符串开始 是否有其他图书馆,本地或第三方,我可以使用?这显然是一件很方便的事情,所以我不太担心,但我想我还是问问吧。你可以自己写一个短消息,但这很容易发生冲突
boost::hash
,虽然我认为它会起作用,但我对散列值最终有多大感到恼火,特别是考虑到我知道我将从短字符串开始
是否有其他图书馆,本地或第三方,我可以使用?这显然是一件很方便的事情,所以我不太担心,但我想我还是问问吧。你可以自己写一个短消息,但这很容易发生冲突 这里有一个我用来返回短/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;
}
无符号短散列(std::string const&s){
短期结果=3;
用于(自动电流=s.begin();电流!=s.end();+电流){
无符号字符c=静态_转换(*当前);
结果=结果+((结果)16))&0xffff;
}
此外,如果您提前知道密钥是什么,并且密钥不多,您可以研究一个完美的散列,您可以使用适当的加密强散列(摘要) 它们有一个很好的特性,即可以在不删除其随机分布特性的情况下对其进行截断(这不是通用哈希值的情况,也不是UUID的情况) 虽然假设原始SHA-1长得多(160位),速度也不快,但只要能够提供有用的小碰撞概率,就可以将其截断得太小 这是DARC、Mercurial、Git等使用提交标识符的方法 注意:为了提高速度,SHA-2的速度更快,并产生512位摘要,因此有一种特殊的方法称为SHA-512/64,例如,将SHA-2的512位截断为64位摘要。此外,您可以查看更快的哈希,如BLAKE或BLAKE2 如果您正在为已知字符串寻找一个完美的哈希,下面是我的一个老答案,它给出了一个完整的例子:
大小\u t
s。谢谢。如果它们是大小\u t
,这真的很重要吗?这会给你带来什么问题吗?嗯,大小是32/64位有符号的值,事实上我认为有这种可能的解决方案是没有问题的。@Raistmajstd::size\u t
未签名。如果字符串提前知道,您希望使用什么来代替std::size\u t
。否则您需要接受它,将哈希限制为小数字必然会增加冲突的几率。