#c #string #hash #hashcode
#c #строка #хэш #хэш-код
Вопрос:
Следующий Java-код возвращает хэш-код строки.
String uri = "Some URI"
public int hashCode() {
return uri.hashCode();
}
Я хочу перевести этот код на c . Есть ли какая-либо функция, доступная в c , или простой способ перевести это.
Комментарии:
1. Для чего вам нужен хэш? Это важно для ответа.
Ответ №1:
В C 03, boost::hash
. В C 11, std::hash
.
std::hash<std::string>()("foo");
Комментарии:
1.
boost::hash
это не C 03, а boost. В средах, которые поддерживаютtr1
(гораздо более широко доступных, чем C 11), вы можете использоватьstd::tr1::hash<T>
, определенный в<tr1/functional>
.2. @user4815162342 «boost::hash — это не C 03, а boost». О, точно, как я мог забыть о C Boost.
3. @jalf В мои намерения никогда не входило подразумевать, что boost — это диалект C , просто это
boost::hash
не является частью C 03, как, например,std::string
есть. Я также указал, чтоstd::tr1::hash
это альтернатива, доступная в некоторых средах, где boost отсутствует. Это было предложение с благими намерениями улучшить в остальном хороший ответ, на который Cat Plus Plus, к сожалению, обиделся.4. Нет, меня просто не волнует политика.
5. но
tr1::hash
также не является частью C 03. Конечно, вы правы в том, что полезно упомянуть оба решения tr1 и boost, потому что кто-то может использовать одно или другое, но не оба. но изначально вы представили это так, как будтоtr1
было каким-то образом «больше C 03», чемboost
есть, что является бессмыслицей. 🙂
Ответ №2:
Boost предоставляет хэш-функцию:
#include <boost/functional/hash.hpp>
int hashCode()
{
boost::hash<std::string> string_hash;
return string_hash("Hash me");
}
Комментарии:
1. Это библиотека только для заголовков, нет необходимости создавать весь boost.
2. Кажется немного чрезмерным, если вы можете просто использовать
std::hash
вместо этого. В чем преимуществоboost
?
Ответ №3:
Ниже приведен исходный код для значения по умолчанию String.hashCode()
в Java, это простое упражнение для реализации на C .
public int hashCode()
{
int h = hash;
if (h == 0 amp;amp; 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;
}
Комментарии:
1. ну … немного задним ходом для этого… Я думаю, это полезно, если вы хотите, чтобы ваше хэширование было совместимо с Java String.hashCode()
2. Если вы правильно вводите значения с 0 и длиной строки, он выдает те же значения, что и строка Java. Но я вижу «общее соглашение» в том, что в C / C нет функции по умолчанию для использования?
Ответ №4:
Лично мне нравится использовать хэш-функции 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
Ответ №5:
Я задал тот же вопрос, что и у вас, надеюсь, этот код поможет вам :
int HashCode (const std::string amp;str) {
int h = 0;
for (size_t i = 0; i < str.size(); i)
h = h * 31 static_cast<int>(str[i]);
return h;
}
Комментарии:
1. Причина, по которой не следует использовать std::hash или boost hash, заключается в том, что мы хотим получить то же возвращаемое значение, что и java.util. Строка. Хэш-код.
Ответ №6:
// Для 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;
}
Комментарии:
1. Откуда берется этот случайный код? Откуда я знаю, что это действительно даст хэши хорошего качества? С какой стати вы вдруг предполагаете, что Qt задействован? Почему мы пишем код с нуля, а не используем предоставленное решение?
2. @thecoshman потому что иногда вы хотите иметь возможность создавать одинаковые хэши на разных языках