$filename=md5(uniqid(microtime()))

md5生成密码时需要注意的:
基于时间来md5,比如md5(time()),md5(microtime())或md5(uniqid())都是不安全的。
恶意的用户根据用户注册的大概时间就可以暴力猜解密码了。根据rand也一样,你rand出来的肯定是有限大小的整数。md5之后的值的个数还是有限的,可以穷举的。
比较好的办法是md5(uniqid(microtime()));
microtime和uniqid都是精确到百万分之一秒,两者同用,只知道秒数,猜中几率是一万亿分之一。

 

uniqid()是什么?

 

今天看手册上关于uniqid的说明:
uniqid()returnsaprefixeduniqueidentifierbasedonthecurrenttimeinmicroseconds.
字面翻译如下:
uniqid()返回一个带前缀的唯一标识基于当前时间精确到微秒.
只是说基于当前时间,但是没有说明与当前时间的关系如何。
echouniqid();可以看到uniqid始终是一个不断变化的长度为13的十六进制数。
echohexdec(uniqid())/microtime(true);
?>
1048575.9999856

输出基本上在1048576左右。
可以断定,uniqid就是当前时间精确到微秒再乘以1048576(2的20次幂),也就是左移20位,最后转换为十六进制得到的。
知道uniqid与time的关系后uniqid就可以有更广泛的用途了,比如用文本论坛可以用uniqid作为帖子的文件名。
做在帖子索引中,可以很方便的按时间查找帖子。