下面的Java代码返回一个字符串的哈希码。
String uri = "Some URI"
public int hashCode() {
return uri.hashCode();
}
我想将这段代码翻译成C++。有没有C++中可用的函数或简单的方法可以翻译这个?
在C++03中使用boost::hash
,在C++11中使用std::hash
。
std::hash<std::string>()("foo");
boost::hash
不是 C++03 的标准,而是 Boost 库中的内容。在支持 tr1
的环境中(比 C++11 更广泛),您可以使用 <tr1/functional>
中定义的 std::tr1::hash<T>
。 - user4815162342boost::hash
不像std::string
一样是C++03的一部分。我还提到,在某些环境中有可用的替代品std::tr1::hash
,当Boost不可用时可以考虑使用它。这只是一个善意的建议,旨在改善一个本来很好的回答,但Cat Plus Plus不幸对此感到冒犯了。 - user4815162342tr1::hash
在 C++03 中也不是一部分。当然,你说得对,提到 tr1 和 boost 解决方案都很有用,因为有些人可能只能使用其中一个而不能同时使用两个。但最初你表述的好像 tr1
比 boost
更符合 C++03,这是无稽之谈。 :) - jalfBoost提供了一个哈希函数:
#include <boost/functional/hash.hpp>
int hashCode()
{
boost::hash<std::string> string_hash;
return string_hash("Hash me");
}
std::hash
,那么感觉使用 boost
有点过头了。boost
有什么优势呢? - User12547645String.hashCode()
的源代码,这在C++中实现是一项简单的练习。public int hashCode()
{
int h = hash;
if (h == 0 && count > 0)
{
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++)
{
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
boost::hash<std::string> string_hash;
std::size_t h = string_hash("Hash me");
我也遇到了你同样的问题,希望下面这段代码能够帮到你:
int HashCode (const std::string &str) {
int h = 0;
for (size_t i = 0; i < str.size(); ++i)
h = h * 31 + static_cast<int>(str[i]);
return h;
}
//对于C++ Qt,您可以使用此代码,其结果与Java hashcode()相同
int hashCode(QString text){
int hash = 0, strlen = text.length(), i;
QChar character;
if (strlen == 0)
return hash;
for (i = 0; i < strlen; i++) {
character = text.at(i);
hash = (31 * hash) + (character.toAscii());
}
return hash;
}