C++ 将std::字符串散列为std::size\t以外的内容

C++ 将std::字符串散列为std::size\t以外的内容,c++,boost,hash,C++,Boost,Hash,作为我目前工作的项目的一部分,我需要使用几个相对较短的字符串(例如“ABCD1234”)作为自定义容器的键。问题是,这个容器中的对象属于其“主键”是数字的类型。因此,我需要将给定的唯一字符串转换为数字,并确保保留唯一性 我一直在尝试使用boost::hash,虽然我认为它会起作用,但我对散列值最终有多大感到恼火,特别是考虑到我知道我将从短字符串开始 是否有其他图书馆,本地或第三方,我可以使用?这显然是一件很方便的事情,所以我不太担心,但我想我还是问问吧。你可以自己写一个短消息,但这很容易发生冲突

作为我目前工作的项目的一部分,我需要使用几个相对较短的字符串(例如“ABCD1234”)作为自定义容器的键。问题是,这个容器中的对象属于其“主键”是数字的类型。因此,我需要将给定的唯一字符串转换为数字,并确保保留唯一性

我一直在尝试使用
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位有符号的值,事实上我认为有这种可能的解决方案是没有问题的。@Raistmaj
std::size\u t
未签名。如果字符串提前知道,您希望使用什么来代替
std::size\u t
。否则您需要接受它,将哈希限制为小数字必然会增加冲突的几率。