如何可能生成一个随机的,唯一的字符串使用数字和字母用于验证链接?就像你在一个网站上创建了一个账户,它会给你发一封带有链接的电子邮件,你必须点击那个链接才能验证你的账户
如何使用PHP生成其中一个?
如何可能生成一个随机的,唯一的字符串使用数字和字母用于验证链接?就像你在一个网站上创建了一个账户,它会给你发一封带有链接的电子邮件,你必须点击那个链接才能验证你的账户
如何使用PHP生成其中一个?
当前回答
我在这里提供了一些很好的研究数据,基于斯科特的答案提供的功能。因此,我为这个为期5天的自动化测试设置了一个数字海洋液滴,并将生成的唯一字符串存储在MySQL数据库中。
在这个测试期间,我使用了5个不同的长度(5、10、15、20、50),每个长度插入+/- 50万条记录。在我的测试中,在50万个重复中,只有长度5产生了+/-3K个重复,其余长度没有产生任何重复。所以我们可以说,如果我们使用Scott函数的长度为15或以上,那么我们就可以生成高度可靠的唯一字符串。以下是我的研究数据:
更新
我使用这些函数创建了一个简单的Heroku应用程序,它将令牌作为JSON响应返回。该应用程序可以在https://uniquestrings.herokuapp.com/api/token?length=15上访问
其他回答
生成一个随机数使用 你最喜欢的随机数 发电机 乘除 得到一个与数字匹配的数字 你的代码字母表中的字符 将该索引处的项插入 你的代码字母。 重复1),直到你有你想要的长度 想要
例如(伪代码)
int myInt = random(0, numcharacters)
char[] codealphabet = 'ABCDEF12345'
char random = codealphabet[i]
repeat until long enough
我们可以用这两行代码生成唯一的字符串,已经测试了大约10000000次迭代
$sffledStr= str_shuffle('abscdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_-+');
$uniqueString = md5(time().$sffledStr);
这个人被一杯水呛到……
$random= substr(str_shuffle(" 0123456789abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvwxyz *.-_"), 0,10);
简单。 这个随机字符串重复的可能性是0,000000000000000000000000000001^70
安全注意:在随机性质量可能影响应用程序安全性的情况下,不应使用此解决方案。特别是,rand()和uniqid()不是加密安全的随机数生成器。关于安全的替代方案,请参阅Scott的回答。
如果你不需要它随着时间的推移是绝对唯一的:
md5 (uniqid (rand()、true))
否则(假设你已经为你的用户确定了一个唯一的登录):
md5(uniqid($your_user_login, true))
我认为所有现有想法的问题在于,它们可能是独特的,但不是绝对独特的(正如Dariusz Walczak在回复looletech时指出的那样)。我有一个唯一的解。它要求您的脚本具有某种内存。对我来说,这是一个SQL数据库。您也可以简单地写入某个文件。有两种实现:
第一种方法:使用两个而不是一个字段来提供唯一性。第一个字段是一个ID号码,它不是随机的,而是唯一的(第一个ID是1,第二个ID是2…)如果使用SQL,只需使用AUTO_INCREMENT属性定义ID字段。第二个字段不是唯一的,而是随机的。这可以通过人们已经提到的任何其他技术来生成。Scott的想法很好,但是md5很方便,对于大多数目的来说可能已经足够好了:
$random_token = md5($_SERVER['HTTP_USER_AGENT'] . time());
第二种方法:基本相同的想法,但最初选择将生成的字符串的最大数量。这可能是一个非常大的数字,比如一万亿。然后做同样的事情,生成一个ID,但是零填充,这样所有的ID都是相同数量的数字。然后将ID与随机字符串连接起来。对于大多数目的来说,它足够随机,但ID部分将确保它也是唯一的。