uniqid()
Saiba como a função uniqid() do PHP gera IDs baseados no tempo em microssegundos, seus parâmetros e quando usá-la.
A função PHP uniqid() gera um ID de string derivado do tempo atual em microssegundos. Esta página explica sua sintaxe e parâmetros, como é o valor retornado, a importante ressalva de que ela não é adequada para tokens de segurança e o que usar em seu lugar.
O que uniqid() faz
uniqid() retorna uma string hexadecimal de 13 caracteres baseada no tempo atual do sistema, medido até o microssegundo. Como o relógio continua avançando, duas chamadas feitas mesmo uma fração de segundo apart geralmente produzem valores diferentes, o que torna a função útil para identificadores de baixo risco, como nomes de arquivos temporários, chaves de cache ou IDs de elementos DOM.
Trata-se de um identificador baseado no tempo, não em um valor aleatório. Essa distinção importa: o valor é previsível e, em uma máquina rápida, duas chamadas no mesmo microssegundo retornam a mesma string. Tenha isso em mente antes de depender dela para unicidade — e nunca para segredos.
Sintaxe
uniqid(string $prefix = "", bool $more_entropy = false): string| Parâmetro | Tipo | Descrição |
|---|---|---|
$prefix | string | Texto adicionado antes do ID retornado. Útil quando vários hosts ou processos podem gerar IDs ao mesmo tempo. O padrão é uma string vazia. |
$more_entropy | bool | Quando true, adiciona caracteres extras que tornam o resultado menos sujeito a colisões. O padrão é false. |
Valor de retorno: uma string. Com argumentos padrão, tem 13 caracteres; com $more_entropy definido como true, tem 23 caracteres (o comprimento do prefixo é adicionado a ambos).
Uso básico
Chame uniqid() sem argumentos para obter um ID simples baseado em timestamp:
O $id retornado tem 13 caracteres hexadecimais. Cada execução imprime um valor diferente porque o timestamp em microssegundos subjacente avançou.
Adicionando um prefixo
Passe uma string como primeiro argumento para adicioná-la antes do ID. Isso ajuda a distinguir IDs gerados em diferentes partes da sua aplicação, ou em servidores diferentes:
O prefixo não é aleatório — ele é adicionado literalmente — portanto não aumenta a unicidade por si só. Seu papel é criar um namespace para o ID.
Mais entropia
Em um loop intenso, o timestamp pode se repetir e você pode obter IDs duplicados. Definir o segundo argumento como true adiciona caracteres extras (baseados em um gerador congruencial linear combinado) para reduzir esse risco:
Com $more_entropy ativado, o resultado tem 23 caracteres. Isso reduz a chance de colisões, mas não torna o valor imprevisível.
Importante: uniqid() não é segura
Este é o erro mais comum com uniqid(). Como o valor é derivado do relógio, um atacante que sabe aproximadamente quando um ID foi criado pode adivinhá-lo. Nunca use uniqid() para:
- tokens de redefinição de senha ou tokens de "link mágico"
- identificadores de sessão ou chaves de API
- tokens CSRF ou qualquer outro valor sensível à segurança
Para qualquer coisa que deva ser imprevisível, use uma fonte criptograficamente segura. random_bytes() (PHP 7+) é a ferramenta certa, opcionalmente convertida em uma string legível com bin2hex():
<?php
// 32-character, cryptographically secure random token
$token = bin2hex(random_bytes(16));
echo "Secure token: " . $token . "\n";
// e.g. Secure token: 93261fb1d3d843e8dac1d3372b4f3306
?>Se você precisar de um identificador globalmente único em um formato padrão, um UUID (via uma biblioteca como ramsey/uuid) geralmente é mais adequado do que uniqid().
Quando usar uniqid()
uniqid() é uma boa escolha quando você precisa de um rótulo rápido e descartável e um pequeno risco de colisão é aceitável:
- nomes de arquivos temporários de upload ou cache
- atributos HTML
idúnicos gerados no lado do servidor - chaves de curta duração em caches não críticos para segurança
Para segredos imprevisíveis, use random_bytes(); para aleatoriedade de uso geral, veja mt_rand() e rand(); e se você precisar apenas do timestamp de alta resolução subjacente, consulte microtime().
Resumo
A função uniqid() produz um ID de 13 caracteres (ou 23 com $more_entropy) a partir do timestamp em microssegundos atual. É conveniente para identificadores não sensíveis e com baixa probabilidade de colisão, mas é previsível por design — para tokens de segurança, prefira sempre random_bytes(). Escolher a ferramenta certa para cada situação garante que seus IDs sejam suficientemente únicos e, quando necessário, impossíveis de adivinhar.