DEV Community

Cover image for O Que São Hash Tables em TypeScript: Conceitos, Exemplos e Uso com Redis
Lucas Pereira de Souza
Lucas Pereira de Souza

Posted on

O Que São Hash Tables em TypeScript: Conceitos, Exemplos e Uso com Redis

Introdução

As hash tables (ou tabelas de dispersão) são uma estrutura de dados fundamental utilizada para armazenar pares de chave-valor de maneira eficiente. Elas são especialmente úteis quando precisamos acessar dados rapidamente sem precisar percorrer toda uma lista. Neste post, vamos explorar como funcionam, como implementá-las em TypeScript, e como o Redis aplica esse conceito.

O Que é uma Hash Table?

Uma hash table é uma estrutura que associa chaves a valores utilizando uma função hash para converter uma chave em um índice de um array onde o valor é armazenado. Esse processo permite operações rápidas de busca, inserção e remoção, geralmente com complexidade de tempo O(1).

Funcionamento Básico

  1. Função Hash: Converte uma chave em um número inteiro que será utilizado como índice do array.
  2. Armazenamento: O valor é armazenado na posição calculada pela função hash.
  3. Busca: Para recuperar um valor, aplicamos novamente a função hash na chave e acessamos o índice correspondente.

Tratamento de Colisões

Colisões ocorrem quando duas chaves diferentes resultam no mesmo índice. Métodos comuns para tratar colisões incluem:

  • Encadeamento: Armazenar múltiplos valores no mesmo índice usando listas ligadas.
  • Endereçamento Aberto: Procurar o próximo índice disponível.

Implementação em TypeScript

Vamos implementar uma versão básica de uma hash table utilizando TypeScript. Este exemplo é inspirado no livro "Entendendo Algoritmos" de Aditya Bhargava.

class HashTable {
  private table: { [key: string]: [string, any][] } = {};

  private hash(key: string): number {
    let hash = 0;
    for (let i = 0; i < key.length; i++) {
      hash += key.charCodeAt(i);
    }
    return hash % 37;
  }

  public put(key: string, value: any): void {
    const position = this.hash(key);
    if (!this.table[position]) {
      this.table[position] = [];
    }

    const index = this.table[position].findIndex(([k]) => k === key);
    if (index >= 0) {
      this.table[position][index][1] = value; // Atualiza o valor existente
    } else {
      this.table[position].push([key, value]); // Adiciona um novo par chave-valor
    }
  }

  public get(key: string): any {
    const position = this.hash(key);
    const bucket = this.table[position];

    if (bucket) {
      const found = bucket.find(([k]) => k === key);
      return found ? found[1] : undefined;
    }

    return undefined;
  }

  public remove(key: string): void {
    const position = this.hash(key);
    const bucket = this.table[position];

    if (bucket) {
      const index = bucket.findIndex(([k]) => k === key);
      if (index >= 0) {
        bucket.splice(index, 1);
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Exemplo de Uso com Arrays

As hash tables podem ser usadas para melhorar buscas em arrays. Por exemplo, se quisermos verificar rapidamente a existência de um número em um array:

function findNumber(arr: number[], target: number): boolean {
  const hashTable = new HashTable();

  for (const num of arr) {
    hashTable.put(num.toString(), true);
  }

  return hashTable.get(target.toString()) !== undefined;
}

const numbers = [1, 2, 3, 4, 5];
console.log(findNumber(numbers, 3)); // true
console.log(findNumber(numbers, 6)); // false
Enter fullscreen mode Exit fullscreen mode

Redis como Implementação de Hash Table

O Redis é um banco de dados em memória que utiliza conceitos de hash tables para armazenar dados de maneira rápida e eficiente. No Redis, podemos usar o tipo de dado HASH para armazenar e acessar pares chave-valor aninhados.

Exemplo de Uso com Redis

import Redis from 'ioredis';

const redis = new Redis();

// Armazenar um hash no Redis
await redis.set('user:1', 'name', 'Lucas', 'age', '30');

// Recuperar um valor específico
const name = await redis.get('user:1', 'name');
console.log(name); // Saída: Lucas

// Recuperar todos os campos de um hash
const user = await redis.getall('user:1');
console.log(user); // Saída: { name: 'Lucas', age: '30' }
Enter fullscreen mode Exit fullscreen mode

Conclusão

As hash tables são uma das estruturas de dados mais importantes na ciência da computação por fornecerem acessos rápidos a dados. O Redis é um exemplo popular de aplicação de hash tables em um banco de dados rápido e eficiente. Ao entender como implementar e utilizar hash tables em TypeScript, você pode criar aplicações mais performáticas e escaláveis.

Referências

Image of Quadratic

The native AI interface for your structured data

Simply type in your prompt and generate insights with the latest LLMs and built-in Python functionality.

Try Quadratic free

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

If this post resonated with you, feel free to hit ❤️ or leave a quick comment to share your thoughts!

Okay