Как получить хеш-код строки в C++
Следующий код Java возвращает хеш-код строки.
String uri = "Some URI"
public int hashCode() {
return uri.hashCode();
}
Я хочу перевести этот код на C++. Есть ли какая-либо функция доступна в C++ или простой способ перевести это.
5 ответов
Решение
Boost предоставляет хеш-функцию:
#include <boost/functional/hash.hpp>
int hashCode()
{
boost::hash<std::string> string_hash;
return string_hash("Hash me");
}
В C++ 03 boost::hash
, В C++ 11 std::hash
,
std::hash<std::string>()("foo");
Ниже приведен источник по умолчанию String.hashCode()
в Java это простое упражнение для реализации в 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
http://www.boost.org/doc/libs/1_47_0/doc/html/hash.html
сделать строковый хеш довольно просто,
boost::hash<std::string> string_hash;
std::size_t h = string_hash("Hash me");
более новые версии C++ имеют эквивалент с std::hash
Я воспользовался тем же вопросом, что и вы, надеюсь, этот код вам поможет:
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;
}