---
name: string_hash_palette
kind: function
lang: ts
domain: core
version: "1.0.0"
purity: pure
signature: "stringHashPalette(s: string, palette: string[]): string"
description: "Mapea un string a un elemento de la paleta usando hash DJB-31 deterministico (h = (h*31 + charCodeAt) >>> 0). Util para asignar colores consistentes a tags, usuarios u otros identificadores de texto."
tags: [hash, color, palette, string, deterministic, utility]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: s
    desc: "String de entrada a hashear. Cualquier string Unicode. String vacio produce h=0, retorna palette[0]."
  - name: palette
    desc: "Array de strings (colores u otros valores) a usar como paleta. No debe estar vacio (lanza Error si lo esta)."
output: "Un elemento de palette seleccionado deterministicamente por h % palette.length. El mismo string siempre retorna el mismo elemento para la misma paleta."
tested: true
tests:
  - "string vacio retorna palette[0]"
  - "mismo string siempre retorna mismo color"
  - "strings distintos pueden dar colores distintos"
  - "paleta vacia lanza error"
  - "paleta de un elemento siempre retorna ese elemento"
test_file_path: "frontend/functions/core/string_hash_palette.test.ts"
file_path: "frontend/functions/core/string_hash_palette.ts"
---

## Ejemplo

```typescript
const TAG_PALETTE = ["blue", "cyan", "teal", "green", "lime", "yellow", "orange", "red", "pink", "grape", "violet", "indigo"];

stringHashPalette("frontend", TAG_PALETTE)  // deterministico, ej: "teal"
stringHashPalette("backend",  TAG_PALETTE)  // deterministico, diferente
stringHashPalette("frontend", TAG_PALETTE)  // mismo resultado siempre

stringHashPalette("x", [])  // throws Error("palette must not be empty")
```

## Notas

Extraida de `apps/kanban/frontend/src/components/colors.ts` lineas 70-76 (funcion `tagColor`).
Generalizada para aceptar cualquier paleta en vez de la constante `TAG_PALETTE` hardcodeada.
El hash DJB-31 (variante de DJB2 con multiplicador 31) produce distribucion uniforme suficiente para asignacion de colores. No es criptografico.
El operador `>>> 0` garantiza entero de 32 bits sin signo, evitando overflow en strings largos.
