检查此方法是否适用于唯一ID

时间:2014-03-11 14:50:11

标签: php

我尝试使用md5创建各种内容的ID以进行编码,但是,我不确定这种方法。

<?php    
$prefix = 'stackoverflow';
$length = 11;
$id = md5( $prefix . uniqid(microtime()) );

$part1 = substr($id, 0,(floor($length / 2))); //First 5 chars

$id = strrev($id); //Reverse md5

$part2 = substr($id, 0,(ceil($length / 2))); //First 6 chars of the reversed md5

$final_id = $part2 . $part1; //Reverse final id
?>

2 个答案:

答案 0 :(得分:2)

你正试图重新发明轮子。

http://www.php.net/manual/en/function.uniqid.php

  

string uniqid([string $ prefix =&#34;&#34; [,bool $ more_entropy = false]])

     

根据当前时间(以微秒为单位)获取带前缀的唯一标识符。

此外,您可能希望使用真正的全局唯一标识符(特定于窗口的扩展名)

http://www.php.net/manual/en/function.com-create-guid.php

答案 1 :(得分:0)

具有随机,唯一ID的东西是 entropy 。即,它是否包含足够的随机数据,在数学上保证在实践中是唯一的?

$id = md5( $prefix . uniqid(microtime()) );

此处,$prefix是静态的,不添加熵。 microtime根本不是随机的,虽然它产生两次相同值的可能性非常低,但它存在。 uniqid为该值增加了一点熵,这在实践中可能已经足够好了。在此之后,您将对值进行散列并减小其长度,这意味着您将再次删除熵。

总的来说,你从一开始就添加了很少的熵,然后减少了一些熵,这总体上并没有让我感觉良好。在实践中,它的可能对于一个小网站来说已经足够好了,但我不会赌它。

您真正需要的只是一个随机数生成器,几乎在所有情况下都内置在您的操作系统中:

$id = bin2hex(file_get_contents('/dev/urandom', false, null, -1, 32));

包含此功能的功能包括openssl_random_pseudo_bytesmcrypt_create_iv。试图通过使用一些看似令人困惑的字符串连接重新发明一个随机数生成器是徒劳的,这不是真正的随机性(在大多数情况下/dev/urandom 都不是真正的随机,但它更好地接近它比以往任何时候都好。根据您的具体情况,您可能还希望开始使用UUIDs