我想知道PHP中是否有一种方法可以生成一个独特的字母数字(区分大小写)标记,它可以永久保持唯一而不会发生任何冲突。如果我们从时间戳字符串派生出来,这些字符串是10个字符,如: 1394452319 ,那么这可能是可能的,但我不确定我们是否可以将令牌缩短为4字符?如果不可能,则 5,6,7和max为8 个字符。因为我想生成短令牌以供用户阅读。
标记应如下所示:1aYc,ZoXq,3iU9等
我不想向用户显示任何序列。
还有一件事,我的应用程序将由多个用户使用,因此如果两个用户同时点击生成令牌,PHP应用程序是否会生成相同的令牌(我假设我们使用时间戳生成令牌)?我们怎样才能防止这个问题?
感谢您的帮助!
答案 0 :(得分:1)
一种方法是拥有一个内部隐藏的增量(即auto_update)id。从那里,您生成一个哈希,表示隐藏序列的ID。增加的id消除了碰撞问题(即MySQL有一个集成的解决方案)。
您现在需要使用的技巧是一个随机哈希表,由两列组成,两列的值均为n到m,但第二列是随机的。即。
col1 | col2
1 | 2
2 | 4
3 | 5
4 | 1
5 | 3
如果您有递增数字的随机排序数字,则很容易从中创建哈希值。想想你的可能的字符作为数字。你明白了吗?
假设你有一个很好的随机数算法,你可以制作一个非常好的哈希表。但是,还有一种方法可以找到一种算法,为您提供增加的数字。所以在这个例子中它会给你col2 = fn(col1)
所以即4 = fn(2)
。
您所要做的就是获取结果并将其重新制作成一个公式:D
否则你最初必须填写表格。
为了让您对数学的数学有所了解,请考虑使用数字的奇数/偶数特征并将其与加法相结合的函数。
对于每个字符,使用62个可能性(区分大小写的字母和数字)的n位数字,您有62 ^ n种可能性。 对于4个数字,可以产生14776336种可能性( 62 ^ 4 )。
你可能听起来很棒,你可以想象有一张桌子,预装了14776336 id并不是最干净的解决方案。
不过,我希望这至少会导致正确的方向。
编辑: 我们开始讨论math.stackexchange.com。 IT有一些关于如何根据我们的需求创建功能的其他信息。
答案 1 :(得分:1)
这是你可以使用的另一个功能
<?php
function generateRandomString($length = 8) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
return $randomString;
}
echo generateRandomString();
?>
答案 2 :(得分:0)
您可以使用以下内容
<?php
// chars
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-+';
// convert to array
$arr = str_split($chars, 1);
// shuffle the array
shuffle($arr);
// array to chars with 8 chars
echo substr(implode('', $arr), 0, 8);
?>
答案 3 :(得分:0)
您可以使用此功能:
// RETRUN 24 digit of UNIX ID :
public function getComplexIDTicket(){ // duplicate method on Rest.php
$arrAZ1 = range('A','Z');
$arrAZ2 = range('A','Z');
$arrAZ3 = range('A','Z');
$arrs1 = range('A','Z');
$arrs2 = range('A','Z');
$arrs3 = range('A','Z');
$a1 = $arrAZ1[rand(0,25)];
$a2 = $arrAZ2[rand(0,25)];
$a3 = $arrAZ3[rand(0,25)];
$s1 = $arrs1[rand(0,25)];
$s2 = $arrs2[rand(0,25)];
$s3 = $arrs3[rand(0,25)];
$s = $s1.$s2.$s3;
$t = microtime(true);
$micro = sprintf("%07d",($t - floor($t)) * 10000000);
$id = date('ymdHis').strtoupper(dechex(substr($micro,0,7)));
$id = str_pad($id, 24, $a3.$a2.$a1.$s, STR_PAD_RIGHT);
// 151106214010 3DDBF0 L D C SM4
return $id;
}