A classe de modelo std::hash em C++

Jinku Hu 12 outubro 2023
  1. Use std::hash para gerar Hash para objetos std::string
  2. Use std::hash para gerar Hash para objetos std::bitset
  3. Use std::hash para gerar Hash para objetos std::vector<bool>
A classe de modelo std::hash em C++

Este artigo irá apresentar a classe de modelo std::hash de STL em C++.

Use std::hash para gerar Hash para objetos std::string

A classe de modelo std::hash é fornecida sob o cabeçalho STL <functional>. Ele cria um objeto de função hash. std::hash satisfaz os requisitos do tipo DefaultConstructible e requer apenas o fornecimento de um argumento de modelo.

Várias especializações padrão desta classe de modelo são fornecidas na biblioteca padrão C++, e a lista completa pode ser vista aqui. Uma vez que o objeto de função hash é criado com o argumento do template fornecido, ele pode ser utilizado para gerar valores hash específicos usando operator() que aceita um único argumento e retorna o valor size_t.

No próximo exemplo, usamos a especialização string e geramos alguns valores hash para strings arbitrárias.

#include <functional>
#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;
using std::string;

int main() {
  string str1("arbitrary string");
  std::vector<string> vec2 = {"true", "false", "false",
                              "true", "false", "true"};

  std::hash<string> str_hash;

  cout << "hash(str1) - " << str_hash(str1) << endl;

  cout << "hash(vec2 elements) - ";
  for (const auto &item : vec2) {
    cout << str_hash(item) << ", ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produção:

hash(str1) - 3484993726433737991
hash(vec2 elements) - 1325321672193711394, 3658472883277130625, 3658472883277130625, 1325321672193711394, 3658472883277130625, 1325321672193711394,

Use std::hash para gerar Hash para objetos std::bitset

Outra especialização de std::hash fornecida no STL é para argumentos std::bitset. Lembre-se de que std::bitset é a classe que representa um número fixo de bits como uma sequência e fornece várias funções de membro para fácil manipulação de bits.

Geralmente, as funções hash usadas por especializações std::hash são dependentes da implementação, e não se deve usar esses objetos como uma solução universal para o problema de hash. Além disso, essas funções hash são necessárias apenas para produzir a mesma saída para a mesma entrada em uma única execução do programa.

#include <bitset>
#include <functional>
#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;
using std::string;

int main() {
  std::bitset<8> b1("00111001");

  std::hash<std::bitset<8>> bitset_hash;

  cout << "hash(bitset<8>) - " << bitset_hash(b1) << endl;

  return EXIT_SUCCESS;
}

Produção:

hash(bitset<8>) - 6623666755989985924

Use std::hash para gerar Hash para objetos std::vector<bool>

Também podemos usar a especialização std::hash para um vetor de valores booleanos, conforme mostrado no seguinte trecho de código. Observe que std::hash também pode ser especializado para classes definidas pelo usuário, e algumas especializações adicionais estão disponíveis através da biblioteca Boost (os detalhes estão listados aqui.

#include <functional>
#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;
using std::string;

int main() {
  std::vector<bool> vec1 = {true, false, false, true, false, true};

  std::hash<std::vector<bool> > vec_str_hash;

  cout << "hash(vector<bool>) - " << vec_str_hash(vec1) << endl;

  return EXIT_SUCCESS;
}

Produção:

hash(vector<bool>) - 12868445110721718657
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook