所以我一直在做一些挖掘,我一直在努力拼凑一个在PHP中生成有效的v4 UUID的函数.这是我能够来的最接近的.我在十六进制,十进制,二进制,PHP的按位运算符等方面的知识几乎不存在.此函数生成有效的v4 UUID直到一个区域.v4 UUID应采用以下形式:
xxxxxxxx-xxxx- 4 xxx- y xxx-xxxxxxxxxxxx
其中y 是8,9,A或B.这是函数失败的地方,因为它不符合它.
我希望在这个领域有比我更多知识的人可以帮助我解决这个问题并帮助我解决这个问题.
功能如下:
<?php
function gen_uuid() {
$uuid = array(
'time_low' => 0,
'time_mid' => 0,
'time_hi' => 0,
'clock_seq_hi' => 0,
'clock_seq_low' => 0,
'node' => array()
);
$uuid['time_low'] = mt_rand(0, 0xffff) + (mt_rand(0, 0xffff) << 16);
$uuid['time_mid'] = mt_rand(0, 0xffff);
$uuid['time_hi'] = (4 << 12) | (mt_rand(0, 0x1000));
$uuid['clock_seq_hi'] = (1 << 7) | (mt_rand(0, 128));
$uuid['clock_seq_low'] = mt_rand(0, 255);
for ($i = 0; $i < 6; …Run Code Online (Sandbox Code Playgroud) 生成一个无法轻易猜到的唯一密钥的最佳方法是什么?
我想为帐户激活和引用目的创建一个唯一的密钥,其中包括一个校验和,以帮助防止用户轻易猜测其他用户激活或引用密钥.
另外,在PHP中是否可以创建自己的会话密钥?如果是这样,你会如何使这个独特?
任何帮助是极大的赞赏.
我正在与一个需要生成数百万字母数字代码的客户合作,这些代码用于杂志刮刮卡,瓶装奖品等.它们必须足够短以便在帽子上打印,他们希望确保不包括像1和I,0和O等模糊字符,并且必须明确存储它们以备将来使用 - 我们可以'只有一个算法可以在某人试图兑换一个时确定"有效性".最后,他们希望确保代码随机分布在一个大的"代码空间"内,这样人们就不能通过遍历字母表来猜测其他代码.
有没有指向合理有效的算法来生成这些类型的代码集?我在信封的背面刮了几下,但这个问题闻起来像是一个不知情的陷阱.
我要做的是为我网站上的文章创建一个12个字符的ID,类似于youtube处理其视频ID的方式(http://www.youtube.com/watch?v=53iddd5IcSU).现在我生成一个MD5哈希,然后像这样抓取它的12个字符:
$ArticleId = substr(MD5("Article".$currentID),10,12)
Run Code Online (Sandbox Code Playgroud)
其中$ currentID是数据库中的数字ID(例如144)
我有点偏执,我会遇到重复的$ ArticleId,但实际上这会发生什么机会?而且,由于我的数据库中的列是唯一的,如何在不抛出丑陋错误的情况下处理这种罕见的情况?
PS我制作了一个小脚本来检查第一个5000 $ ArticleId中的重复项,但没有.
编辑:我不喜欢base64_encode哈希的样子,所以我这样做:
function retryAID($currentID)
{
$AID = substr(MD5("Article".$currentID*2),10,12);
$setAID = "UPDATE `table` SET `artID` = '$AID' WHERE `id` = $currentID ";
mysql_query($setLID) or retryAID($currentID);
}
$AID = substr(MD5("Article".$currentID),10,12);
$setAID = "UPDATE `table` SET `artID` = '$AID' WHERE `id` = $currentID ";
mysql_query($setAID) or retryAID($currentID);
Run Code Online (Sandbox Code Playgroud)
由于AID列是唯一的,mysql_query将抛出一个错误,retryAID函数将找到一个唯一的id ...