将std :: string哈希到除std :: size_t之外的其他东西

时间:2015-03-20 16:21:04

标签: c++ boost hash

作为我目前正在进行的项目的一部分,我需要使用几个相对较短的字符串(例如" ABCD1234")作为自定义容器的键。问题是,这个容器中的对象属于"主键",可以说是数字。所以我需要把独特的字符串给我,把它们翻译成数字,并确保我保留唯一性。

我一直在尝试使用boost::hash,虽然我认为它会起作用,但我对哈希值最终会有多大感到恼火,特别是考虑到我知道我我将开始用短串。

我可以使用另一个图书馆,本地或第三方吗?这显然是一件方便的事情,所以我并不太担心,但我想也可以问。

3 个答案:

答案 0 :(得分:1)

你可以编写自己的短片,但这很容易发生碰撞。

这是一个我适应返回短/ 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;
}

另外,如果你提前知道你的密钥是什么,并且没有很多密钥,你可以查看一个完美的哈希

答案 1 :(得分:1)

您可以使用正确的加密强哈希(摘要)。

这些具有很好的属性,可以在不删除其随机分布属性的情况下截断它们(这不是通用哈希值的情况,也不是UUID的情况)。

虽然说原始SHA-1更长(160位)并且也没有那么快,但只要你能提供有用的小碰撞概率,就可以截断它太小的值。

这是Darcs,Mercurial,Git等采用其提交标识符的方法。

注意速度,SHA-2更快,并产生512位摘要,因此有一种称为SHA-512/64的特殊方法,例如。将SHA-2的512位截断为64位摘要。此外,您可以查看更快的哈希值,例如BLAKE或BLAKE2。

如果你正在为已知的字符串寻找一个完美的哈希值,这里有一个旧答案,给出了一个完整的例子:

答案 2 :(得分:0)

事实证明,对我来说这两种解决方案都不可行。我只需要与size_t合作。谢谢。