PHP算法——生成唯一字符串

经常遇到忘记密码的情况,点击一下忘记密码,然后收到更改密码的链接,连接中往往都会有一段很长而且很乱的字符串。试想一下,如果出现了重复的字符串,那岂不是把别人的密码给重置了?

所以产生唯一数对于网站的安全性很重要。

目前PHP能产生唯一数的方法可以采用散列值、随机数、时间等方法,下面是我自己测试的唯一数,个人推荐GUID。

方法一:

<?PHP

     $str = uniqid(mt_rand(),1);
     echo ‘sha1: ‘,sha1($str);
     echo ‘<br>‘;
     echo ‘MD5: ‘,md5($str);

 ?>

采用uniqid函数,配合mt_rand随机函数,最后使用散列值得出最终唯一值。

但是通过测试中,发现随机数的唯一性有些相同部分,大概有11位相同的(但无大碍)

第二种方法:GUID

<?PHP

     echo sprintf(‘%04X%04X-%04X-%04X-%04X-%04X%04X%04X‘, mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
     echo "<br>";
     echo sprintf(‘%04X%04X-%04X-%04X-%04X-%04X%04X%04X‘, mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
     echo "<br>";
     echo sprintf(‘%04X%04X-%04X-%04X-%04X-%04X%04X%04X‘, mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
     echo "<br>";
     echo sprintf(‘%04X%04X-%04X-%04X-%04X-%04X%04X%04X‘, mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));

 ?>

关于UUID的介绍可以参考:http://www.cnblogs.com/ghj1976/archive/2011/09/21/2184029.html

时间: 2024-08-01 10:45:35

PHP算法——生成唯一字符串的相关文章

C# 根据twitter的snowflake算法生成唯一ID

C# 版算法: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Demo 8 { 9 10 /// <summary> 11 /// 根据twitter的snowflake算法生成唯一ID 12 /// snowflake算法 64 位 13 /// 0---000

Django生成唯一字符串UUID与MD5

1 Python使用UUID库生成唯一ID UUID是128位的全局唯一标识符,通常由32字节的字符串表示,保证时间和空间的唯一性 通过MAC地址.时间戳.命名空间.随机数.伪随机数来保证生成ID的唯一性 用法: uuid1()--基于时间戳 uuid3()--基于名字的MD5散列值 通过计算名字和命名空间的MD5散列值得到,保证了同一命名空间中不同名字的唯一性, 和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的uuid. uuid4()--基于随机数 由伪随机数得到,有一定的重复概率

使用SnowFlake算法生成唯一ID

转自:https://segmentfault.com/a/1190000007769660 考虑过的方法有 直接用时间戳,或者以此衍生的一系列方法 Mysql自带的uuid 以上两种方法都可以查到就不多做解释了 最终选择了Twitter的SnowFlake算法 这个算法的好处很简单可以在每秒产生约400W个不同的16位数字ID(10进制) 原理很简单 ID由64bit组成 其中 第一个bit空缺 41bit用于存放毫秒级时间戳 10bit用于存放机器id 12bit用于存放自增ID 除了最高位

ios 下两种生成唯一字符串的方法

CFUUIDRef uuidRef =CFUUIDCreate(NULL); CFStringRef uuidStringRef =CFUUIDCreateString(NULL, uuidRef); CFRelease(uuidRef); NSString *uniqueId = (__bridgeNSString *)uuidStringRef;

PHP 生成随机字符串与唯一字符串

说明:生成随机字符串用到的方法有 mt_rand() 生成唯一字符串用到的方法有 md5(),uniqid(),microtime() 代码: 1 <?php 2 /* 3 * 生成随机字符串 4 * @param int $length 生成随机字符串的长度 5 * @param string $char 组成随机字符串的字符串 6 * @return string $string 生成的随机字符串 7 */ 8 function str_rand($length = 32, $char =

PHP生成随机或者唯一字符串

本文出至:新太潮流网络博客 /** * [生成随机字符串] * @E-mial [email protected] * @TIME 2017-04-07 * @WEB http://blog.iinu.com.cn * @param integer $length [生成的长度] * @param integer $type [生成的类型] * @return [type] str [description] * @php 随机码类型:0,数字+大写字母:1,数字:2,小写字母:3,大写字母:4

生成随机字符串的几种常用方式

写在前面 今天在学习数据库的时候想随机生成一些数据来插入到数据表中,但是一时想不起来如何生成随机内容,就整理了之前学过的一些生成随机字符串的命令,以备不时之需,希望对各位有所帮助. 生成随机字符串的几种方式 1,利用系统变量RANDOM生成随机数 [[email protected] ~]# echo $RANDOM  生成随机数 [[email protected] ~]# echo $((RANDOM%100+1)) 生成1-100内的随机数(取余法) 2,利用openssl生成随机字符串,

sql 生成唯一随机数字字符串

oracle 实现快速批量生成随机数字字符串: --表 create table RANDOM_NUMBER_TEMP ( ROW_NUM NUMBER default 0 not null, RANDOM_NUM VARCHAR2(30) not null ) --type type number_array_t is table of number index by binary_integer; --实现生成唯一随机数 PROCEDURE INIT_RANDOM_NUMBRE(P_QUAN

在C#中生成唯一的字符串和数字【GUID】转

转自:http://www.cnblogs.com/lcwzj/archive/2009/04/16/1436992.html 当我们想要获得一个唯一的key的时候,通常会想到GUID.这个key非常的长,虽然我们在很多情况下这并不是个问题.但是当我们需要将这个36个字符的字符串放在URL中时,会使的URL非常的丑陋. 想要缩短GUID的长度而不牺牲它的唯一性是不可能的,但是如果我们能够接受一个16位的字符串的话是可以做出这个牺牲的. 我们可以将一个标准的GUID 21726045-e8f7-4