Criando GUIDs com PHP?
Essa é uma pergunta meio velha já. Mas não há uma resposta satisatória para ela, pelo menos no meu ponto de vista. Uma solução que resolva todos os problemas em todas as plataformas. Aponto as soluções que pesquisei e achei abaixo:
1. Para quem roda PHP no Windows
Essa é fácil. Desfaça-se do trabalho duro e deixe o Component Object Model fazer o serviço pra você, em estrondosa (1) linha de código.
$guid = com_create_guid();
A vantagem desse método, para quem tem Windows como servidor, é que o GUID gerado é pseudo-sequencial (o que ajuda muito quando usa-se um GUID como chave primária de um banco de dados).
2. PHP em qualquer plataforma com MySQL
MySQL é uma coisa linda de Deus, assim como a Avaiana de Pau. E tem uma série de funções internas que podem facilitar o trabalho do programador preguiçoso (ou esperto, como diria Larry Wall). Por exemplo, o MySQL também tem uma função chamada GUID() que gera um identificador pseudo-sequencial, usando o endereço MAC da placa de rede em Linux e FreeBSD e a data/hora do computador em Windows, Mac e Solaris.
Basta fazer todo o código de uma consulta SQL normal, mas usando a seguinte sintaxe:
SELECT GUID();
Ou então ainda mais preguiçosamente, na hora e inserir o número no banco de dados, porque não criá-lo só quando for necessário?
INSERT INTO customers(guid, nome, endereco) VALUES (GUID(), 'nome', 'endereco');
Muita gente não gosta de usar o MySQL para nada que não seja inserir, procurar, retirar e mexer nos dados. É uma boa prática, sempre, separar banco de dados da programação normal (ou seja, não parece ser uma boa idéia pela maioria usar o MySQL para guardar valores LONGTEXT compactados - sim, o MySQL tem funções para ZIP e BZIP), deixando programação com a página ou script, e o banco apenas armazenando e manipulando informação.
3. Hardcore-PHP, para quem não tem preguiça
É possível também criar um script em PHP que faça todo o trabalho duro. Mas atenção: esse número deixa de ser pseudo-sequencial, como veremos logo adiante. Eu comentei o código direto abaixo, e espero que ele seja auto-explicativo.
A função tem apenas um parâmetro, $WinStyle (true/false), para saber se o GUID gerado virá com os {} ou não.
A mágica dela resume-se em usar a função uniqid() e fazer um hash MD5, de modo a obter uma sequência de 32 caracteres.
function createGUID($WinStyle) {
/*
description:
creates a GUID-like value, using md5 hash, the uniqid() function and the Mersenne Twister Random
number generator, in order to make it harder to predict the value (the uniqid() function is time-based).
returns the GUID as a string 36-character lengthy (32 numbers plus four em-dashes like '-');
the $WinStyle parameter is for Windows-style GUIDs, with {} after and before the GUID value
and all the characters to uppercase.
In order to avoid multiple substrings, I tried to use regular expressions, reducing the number of
code lines from 8 to 3 ONLY for partioning the $number. Adieu, substrings!
*/
//creates the random number with a 32-hex-character pattern
$number = md5(uniqid(mt_rand(), true));
/*
defines the pattern of the Perl-compatible reg. expression for a GUID
this patter means: any character from a to f or 0 to 9 in a group of 8, then 4, 4, 4 and 12.
So, ([a-fA-F0-9]{8}) neans 8 characters without spaces, being from a-f (or A-F) and/or 0-9
any of the between-parenthesis pattern is stored in a temporary variable $n, so, $1 would be the
first-matched pattern (8-char long), and so on.
the replacement is only the 5 patterns with dashes between them.
*/
$preg_pattern = '/([a-fA-F0-9]{8})([a-fA-F0-9]{4})([a-fA-F0-9]{4})([a-fA-F0-9]{4})([a-fA-F0-9]{12})/';
$preg_replacement = '$1-$2-$3-$4-$5';
$guid = preg_replace($preg_pattern, $preg_replacement, $number);
if($WinStyle === true) {
//exclusive format for windows-style GUID, otherwise it leaves the way it is.
$guid = '{' . strtoupper($guid) . '}';
}
return $guid;
} //end createGUID
Claro que esse código pode ser melhorado. Mas aí estão algumas alternativas.
0 Comentários:
Postar um comentário
Links para esta postagem:
Criar um link
<< Início