Gerando números de identificação (ID) únicos com PHP

Atenção! Essa postagem foi escrita há mais de 2 anos. Na informática tudo evolui muito rápido e algumas informações podem estar desatualizadas. Embora o conteúdo possa continuar relevante, lembre-se de levar em conta a data de publicação enquanto estiver lendo. Caso tenha sugestões para atualizá-la, não deixe de comentar!

Fala, meu povo!

Tudo sossegado?

Essa semana estava trabalhando em um sistema que precisava gerar IDs únicos para acesso e fui dar uma pesquisada pra ver o que encontrava. E não é que, para a minha surpresa, o PHP possui um gerador de IDs únicos?

A função chama-se uniqid() e funciona da seguinte maneira:

[code]string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )[/code]

Cada ID é gerado de acordo com os microsegundos, ou seja, se você estiver gerando IDs únicos em hosts diferentes é interessante utilizar o parâmetro $prefix para estipular um prefixo para cada ID gerado e evitar que sejam gerados hashs iguais (no mesmo microsegundo).

Modo simples

Chamar a função sem nenhum parâmetro irá gerar um ID único de 13 caracteres.

Eu utilizei este código e obtive os seguintes resultados:

<?php

	for ($i = 0; $i < 20; $i++)
	{
		echo uniqid() , '<br />';
	}

[code]4e7a2a9eda4f4
4e7a2a9eda513
4e7a2a9eda520
4e7a2a9eda52c
4e7a2a9eda538
4e7a2a9eda53e
4e7a2a9eda545
4e7a2a9eda54a
4e7a2a9eda54f
4e7a2a9eda553
4e7a2a9eda558
4e7a2a9eda55d
4e7a2a9eda562
4e7a2a9eda567
4e7a2a9eda56c
4e7a2a9eda571
4e7a2a9eda576
4e7a2a9eda57b
4e7a2a9eda580
4e7a2a9eda585[/code]

Nessa amostra é possível perceber que um padrão é seguido, porém a variação sempre está presente.

Aumentando a entropia

É possível aumentar a entropia e bagunçar ainda mais o número, diminuindo a previsibilidade do identificador gerado.

Alterando para true o segundo parâmetro da função, aumentaremos de 13 para 23 o número de caracteres gerados.

<?php

	for ($i = 0; $i < 20; $i++)
	{
		echo uniqid(NULL, true) ,  '<br />';
	}

[code]4e7a289bd01f45.79477223
4e7a289bd02032.89581934
4e7a289bd02052.11471119
4e7a289bd02075.00423065
4e7a289bd02085.08264238
4e7a289bd020a0.54923203
4e7a289bd020b3.38239852
4e7a289bd020c5.41874042
4e7a289bd020e7.13109847
4e7a289bd020f8.07879585
4e7a289bd02105.23156388
4e7a289bd02121.78128696
4e7a289bd02133.03380035
4e7a289bd02142.46928362
4e7a289bd02158.14421079
4e7a289bd02168.85897068
4e7a289bd02186.39675466
4e7a289bd02192.69187621
4e7a289bd021a1.41820411
4e7a289bd021b4.97244295[/code]

Identificadores extremamente imprevisíveis

Pra finalizar, uma paulada! Vamos preencher o primeiro parâmetro (prefixo) utilizando a função rand(). Então teremos um identificador de entropia elevadíssima, sendo um ID aleatório de 23 posições precedido por um número aleatório.

<?php

	for ($i = 0; $i < 20; $i++)
	{
		echo uniqid(rand(), true) , '<br />';
	}

[code]19060798504e7a29e9c9c059.93729338
13329376364e7a29e9c9c121.60865627
11839762204e7a29e9c9c151.33271890
15126155264e7a29e9c9c173.28119226
3205916434e7a29e9c9c196.14831352
6879387264e7a29e9c9c1a1.12625014
12097042174e7a29e9c9c1c4.76932924
5578020564e7a29e9c9c1e8.49604578
8800718324e7a29e9c9c1f7.42284494
3516524794e7a29e9c9c210.74379494
13719049204e7a29e9c9c232.53688755
13615040334e7a29e9c9c258.57255460
9026903494e7a29e9c9c262.94629146
12770888504e7a29e9c9c283.76903832
2071162574e7a29e9c9c2a1.35952502
7032290634e7a29e9c9c2b9.36462979
3520522964e7a29e9c9c2d3.39877178
4841746524e7a29e9c9c2e4.67328983
15352161784e7a29e9c9c301.78593394
16981154524e7a29e9c9c318.06476122[/code]

Wow! :D

Considerações finais

O sistema mostrou-se extremamente eficiente para realizar a tarefa a que se propõe e eu fiquei bastante satisfeito com os resultados obtidos.

Espero que tenha sido uma dica útil e gostaria de lembra-los que o blog está sempre aberto a comentários, sendo de críticas, elogios ou sugestões!

Um abraço a todos!
Fiquem com Deus.

Rafael Jaques