Saltar al contenido principal
ProductosHerramientas de escritorioTASTECADRevisión de planosTASTEFILESGestión de archivosTASTEFTPTransferencia de archivosTASTESSHEspacio de trabajo remotoTASTEZIPCompresión y extracciónHerramientas para desarrolladoresTASTECODEEntorno de desarrollo integrado para RustTASTESTUDIOEntorno integrado de desarrollo y pruebasTASTEETLIntegración de datos (ETL)ServidoresTASTEREMOTEServidor de escritorio remotoTASTEGEOServidor geoespacialTASTEMAILEspacio de trabajo de correoEmpezarDescargasDocumentaciónComprarTodos los productos
Marketplace
Noticias
TecnologíaNoticiasNoticias de desarrollo de hoyDocumentaciónLenguajes de programaciónRustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDartFrameworks web frontendNext.jsReactVue.js · NuxtSvelteKitAngularFrameworks de servidorSpring BootDjangoFastAPIASP.NET CoreNestJS · ExpressFrameworks de apps y escritorioTauriFlutterReact NativeElectronAlgoritmosFundamentos de algoritmosAlgoritmos esencialesAlgoritmos avanzadosAlgoritmos prácticos
ComunidadProyectosRegistros de desarrolloPromptsProblemas con herramientas de IAEscaparateGuía de la comunidad
ColaboraTransferencia técnicaDesarrollo de sitio webDesarrollo de app de escritorioCanal de lanzamiento y pagosSocio de ventasContacto
ServiciosEscritorio remotoPaquetes de instalación a medida
TASTEDEV
Productos

Herramientas de escritorio

TASTECADAbre planos complejos con ligerezaTASTEFILESSolo los archivos que necesitas, lo más rápido posibleTASTEFTPEl camino más limpio para tus archivosTASTESSHEntre tu servidor y tú, una conexión más sólidaTASTEZIPComprime más rápido, descomprime más seguro

Herramientas para desarrolladores

TASTECODEEdita, compila, depura y prueba apps de Rust en una sola ventanaTASTESTUDIODe la edición a las pruebas remotas y las correcciones con IA aprobadasTASTEETLMueve datos viendo sus valores

Servidores

TASTEREMOTEUn escritorio remoto que funciona en tu propio servidorTASTEGEOUn servidor geoespacial compatible con GeoServer, reconstruido en RustTASTEMAILRecupera el control de tu correo

Empezar

DescargasÚltimas versiones de cada productoDocsCómo usar cada productoComprarSuscripciones y licencias perpetuasTodos los productosTodos los productos de un vistazo
Todos los productos
MarketplaceNoticias
Tecnología

Noticias

Noticias de desarrollo de hoyAnuncios oficiales de lenguajes, frameworks, GitHub e IADocumentaciónGuías de lenguajes, frameworks y algoritmos

Lenguajes de programación

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

Frameworks

Frameworks web frontendNext.jsReactVue.js · NuxtSvelteKitAngular
Frameworks de servidorSpring BootDjangoFastAPIASP.NET CoreNestJS · Express
Frameworks de apps y escritorioTauriFlutterReact NativeElectron

Algoritmos

Fundamentos de algoritmosAnálisis de complejidad · Ordenamiento · Búsqueda · Estructuras de datos básicas · Árboles y montículosAlgoritmos esencialesRecorrido de grafos · Camino mínimo y árbol generador mínimo · Programación dinámica · Algoritmos voraces · Divide y vencerás · Backtracking (vuelta atrás)Algoritmos avanzadosAlgoritmos de cadenas · Matemáticas y teoría de números · Manipulación de bits · Árboles de segmentos · Union-FindAlgoritmos prácticosEstrategia para entrevistas de código · Caché LRU · Limitación de tasa · Hashing consistente
Toda la documentación de desarrollo
Comunidad
ProyectosDescubre creadores y su trabajoRegistros de desarrolloDecisiones y aprendizajesPromptsInstrucciones reutilizablesProblemas con herramientas de IAProblemas y alternativas de Claude, Codex, GeminiEscaparateResultados terminadosGuía de la comunidadCómo construimos en abierto
Colabora
Transferencia técnicaApps nativas con Rust y eguiDesarrollo de sitio web10 idiomas, cuentas, documentación y descargasDesarrollo de app de escritorioRust y egui, sin WebViewCanal de lanzamiento y pagosFirma, MSI, deb, rpm, AppImage, hashesSocio de ventasRecomiéndanos y gana el 30 %ContactoDesarrollo, alianzas e inversión
Servicios
Escritorio remotoAccede a tu ordenador desde el navegadorPaquetes de instalación a medidaSolo lo necesario, ajustes precargados
Comprar
ES
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
Iniciar sesión
Iniciar sesión
TASTEDEV

De pequeñas herramientas a un mejor desarrollo.

support@tastedev.netApoyar a TASTEDEV
ProductosLínea de productosComprarDocsDescargasMarketplaceSoporte
ComunidadProyectosRegistros de desarrolloPromptsProblemas con herramientas de IAEscaparate
PolíticasPolítica de privacidadTérminos de servicioCondiciones de suscripciónReembolsosNormas de la comunidad
CuentaIniciar sesiónRegistrarse
Visitantes
Hoy
012345678901234567890123456789012345678901234567890123456789
Ayer
012345678901234567890123456789012345678901234567890123456789
Vistas totales
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
Empresa
GXSOFT
Representante
CHOI YOUNG GU
Número de registro mercantil
853-44-00368
Dirección
9F V24, 351 Gyeongin-ro, Michuhol-gu, Incheon, Republic of Korea
Teléfono
+82-10-4404-1523
Correo electrónico
whitecalvin@tastedev.net
Responsable de privacidad
CHOI YOUNG GU

© 2026 TASTEDEVLa información de los productos se basa en fuentes de desarrollo verificadas.Publicado · en mejora

Documentación
Hashing consistente
Hashing consistenteImplementación de referenciaGuía paso a pasoDocumentación oficial y recursosDebatesComentarios

Otros algoritmos

Fundamentos de algoritmos5
Análisis de complejidadOrdenamientoBúsquedaEstructuras de datos básicasÁrboles y montículos
Algoritmos esenciales6
Recorrido de grafosCamino mínimo y árbol generador mínimoProgramación dinámicaAlgoritmos voracesDivide y vencerásBacktracking (vuelta atrás)
Algoritmos avanzados5
Algoritmos de cadenasMatemáticas y teoría de númerosManipulación de bitsÁrboles de segmentosUnion-Find
Algoritmos prácticos3
Estrategia para entrevistas de códigoCaché LRULimitación de tasa

Algoritmo

Hashing consistente

El hashing consistente reparte claves entre servidores para que añadir o quitar un nodo solo mueva las claves necesarias; se usa en cachés y almacenes.

Empezar la guíaDebates

El hashing consistente es una forma de repartir claves entre muchos servidores, propuesta por Karger y colaboradores en 1997 para cachés web distribuidas. Trata el espacio de hash como un anillo, coloca servidores y claves sobre él y asigna cada clave al primer servidor que se encuentra en el sentido de las agujas del reloj. Dar a cada servidor varios puntos en el anillo, llamados nodos virtuales, equilibra la carga.

Con hash(key) % N, cambiar el número de servidores reubica casi todas las claves: la tasa de aciertos de la caché se desploma y hay que mover enormes volúmenes de datos. El hashing consistente mueve de media solo 1/(N+1) de las claves al añadir un servidor, y solo hacia el nuevo, así que el clúster puede crecer y encogerse en funcionamiento. Ketama en los clientes de Memcached, el artículo de Dynamo de Amazon, Cassandra y las opciones de hash consistente de Nginx y HAProxy se basan en esta idea.

Empieza calculando cuántas claves mueve el sharding mod-N y luego implementa un anillo de hash con un arreglo ordenado y búsqueda binaria. Después mide cómo se reduce la dispersión de la carga al añadir nodos virtuales y compara la selección de réplicas, el hashing de rendezvous y el jump consistent hash. Con esa base podrás explicar los compromisos con claridad en entrevistas de diseño de sistemas.

En esta página

  1. Lo más destacado
  2. Dónde se usa
  3. Implementación de referencia
  4. Guía paso a paso
  5. Documentación oficial y recursos
  6. Debates
  7. Comentarios

Lo más destacado

Movimiento mínimo

Añadir o quitar un nodo mueve en promedio cerca de 1/(N+1) de las claves, y los nodos existentes nunca intercambian claves entre sí.

Anillo de hash

El espacio de hash es un círculo y una clave pertenece al primer nodo en sentido horario. La consulta es una búsqueda binaria sobre posiciones ordenadas.

Nodos virtuales

Varios puntos por nodo reducen el desequilibrio de carga, y su número expresa diferencias de capacidad entre servidores.

Replicación y alternativas

Las réplicas van a los siguientes R nodos distintos en sentido horario; el hashing de rendezvous y el jump hash logran el mismo objetivo de otra forma.

Dónde se usa

  • Sharding en el cliente para cachés distribuidas como Memcached
  • Particionado y replicación en almacenes estilo Dynamo como Cassandra
  • Afinidad de peticiones en balanceo de carga con Nginx, HAProxy y Envoy
  • Tablas hash distribuidas como Chord

Implementación de referencia

Un anillo de hash con nodos virtuales

Los primeros 8 bytes de un resumen MD5 sirven como posición en el anillo, y cada nodo recibe 100 nodos virtuales insertados en una lista ordenada con bisect.insort. get usa bisect_left para hallar el primer punto en la posición de la clave o después y vuelve al principio al pasar del final. Añadir el nodo D mueve solo alrededor de una cuarta parte de las claves, y al quitarlo cada clave regresa a su nodo original.

consistent_hashing.py

import bisect
import hashlib


def h(key: str) -> int:
    return int.from_bytes(hashlib.md5(key.encode()).digest()[:8], "big")


class HashRing:
    def __init__(self, nodes=(), vnodes=100):
        self.vnodes = vnodes
        self.points = []   # sorted hash positions on the ring
        self.owner = {}    # position -> physical node
        for node in nodes:
            self.add(node)

    def add(self, node):
        for i in range(self.vnodes):
            p = h(f"{node}#{i}")
            bisect.insort(self.points, p)
            self.owner[p] = node

    def remove(self, node):
        for i in range(self.vnodes):
            p = h(f"{node}#{i}")
            self.points.pop(bisect.bisect_left(self.points, p))
            del self.owner[p]

    def get(self, key):
        if not self.points:
            raise LookupError("ring is empty")
        i = bisect.bisect_left(self.points, h(key)) % len(self.points)
        return self.owner[self.points[i]]


ring = HashRing(["A", "B", "C"])
keys = [f"user:{n}" for n in range(10_000)]
before = {k: ring.get(k) for k in keys}
ring.add("D")
moved = sum(before[k] != ring.get(k) for k in keys)
print(f"moved {moved / len(keys):.1%} of keys")  # about 25%
ring.remove("D")
print(all(ring.get(k) == before[k] for k in keys))  # True
python consistent_hashing.py

Guía paso a paso

Seis capítulos que te llevan desde la instalación hasta las ideas clave de Hashing consistente.

  1. Consistent hashing conceptsInglés
  2. How it worksInglés
  3. ImplementationInglés
  4. ComplexityInglés
  5. Practice problemsInglés
  6. Real-world useInglés

Documentación oficial y recursos

  • Oficialbisect — Array bisection algorithm
  • OficialNginx upstream module: hash
  • OficialApache Cassandra: Dynamo architecture
  • ReferenciaConsistent hashing (Wikipedia)
  • ReferenciaRendezvous hashing (Wikipedia)
  • ReferenciaA Fast, Minimal Memory, Consistent Hash Algorithm (Lamping & Veach)
  • ReferenciaDynamo: Amazon's Highly Available Key-value Store
  • ReferenciaChord (peer-to-peer) (Wikipedia)

Debates

Iniciar un debate

Haz preguntas, comparte tu experiencia e intercambia opiniones sobre Hashing consistente.

Todavía no hay debates. Empieza el primero.

0 comentarios

Comentarios destacadosMás recientes primero

Iniciar sesión · Inicia sesión para dejar un comentario.