---
name: random_hex_id
kind: function
lang: go
domain: core
version: "1.0.0"
purity: impure
signature: "func RandomHexID(numBytes int) (string, error)"
description: "Genera un string hex aleatorio leyendo numBytes bytes de crypto/rand. El resultado tiene longitud numBytes*2. Retorna error si numBytes<=0 o si falla crypto/rand."
tags: ["random", "id", "hex", "uuid-alternative"]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: ["crypto/rand", "encoding/hex", "fmt"]
params:
  - name: numBytes
    desc: "numero de bytes aleatorios a leer de crypto/rand; el string resultante mide numBytes*2 caracteres hex"
output: "string hex en minusculas con 2*numBytes caracteres, o error si numBytes<=0 o falla la lectura de crypto/rand"
tested: true
tests:
  - "8 bytes retorna 16 caracteres hex validos"
  - "dos llamadas devuelven valores distintos"
  - "numBytes 0 retorna error"
  - "numBytes negativo retorna error"
test_file_path: "functions/core/random_hex_id_test.go"
file_path: "functions/core/random_hex_id.go"
---

## Ejemplo

```go
id, err := RandomHexID(8)
if err != nil {
    log.Fatal(err)
}
// id = "a3f1c9b204e87d6a" (16 chars hex, aleatorio)

// Para IDs de 32 chars (128 bits, equivalente a UUID sin guiones):
id32, _ := RandomHexID(16)
// id32 = "4e2a1b9c7d8f0e3a5c6b2d4f1a9e8c7b"
```

## Notas

Funcion impura — usa `crypto/rand` (respaldado por `/dev/urandom` o equivalente del SO). No es determinista.

Usos tipicos:
- `RandomHexID(8)` → 16 chars, 64 bits de entropia. Suficiente para IDs de rows en SQLite con tablas pequeñas (<10M filas).
- `RandomHexID(16)` → 32 chars, 128 bits. Equivalente a UUID v4 sin guiones.
- `RandomHexID(32)` → 64 chars, 256 bits. Equivalente a SHA-256 de entropia.

Comparacion con `session_create_go_infra`: esa funcion genera tokens de 32 bytes internamente pero no expone la primitiva. Esta funcion es la primitiva componible que cualquier app puede usar directamente.
