web-dev-qa-db-fra.com

comment obtenir le code de hachage d'une chaîne en c ++

Le code Java suivant renvoie le code de hachage d'une chaîne. 

String uri = "Some URI"
public int hashCode() {
    return uri.hashCode();
}

Je veux traduire ce code en c ++. Existe-t-il une fonction disponible dans c ++ ou un moyen facile de traduire cela? 

19
sufyan siddique

Boost fournit une fonction de hachage:

boost hash

#include <boost/functional/hash.hpp>

int hashCode()
{
    boost::hash<std::string> string_hash;

    return string_hash("Hash me");
}
15
tune2fs

En C++ 03, boost::hash. En C++ 11, std::hash.

std::hash<std::string>()("foo");
55
Cat Plus Plus

Ce qui suit est la source de la String.hashCode() par défaut en Java. Il s’agit d’un exercice trival à implémenter en 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;
   }
6
user177800

Personnellement, j'aime utiliser les fonctions de hachage de boost

http://www.boost.org/doc/libs/1_47_0/doc/html/hash.html

faire un hachage de chaîne est assez simple,

boost::hash<std::string> string_hash;

std::size_t h = string_hash("Hash me");

les nouvelles versions de C++ ont un équivalent avec std :: hash

4
Megatron

// Pour C++ Qt, vous pouvez utiliser ce code, le résultat est le même que pour 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
Javier Gonzalez