как получить хэш-код строки в c

#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 потому что иногда вы хотите иметь возможность создавать одинаковые хэши на разных языках