如何生成唯一(永久)字母数字标记(仅限4到8位数)

时间:2014-03-14 13:08:29

标签: php

我想知道PHP中是否有一种方法可以生成一个独特的字母数字(区分大小写)标记,它可以永久保持唯一而不会发生任何冲突。如果我们从时间戳字符串派生出来,这些字符串是10个字符,如: 1394452319 ,那么这可能是可能的,但我不确定我们是否可以将令牌缩短为4字符?如果不可能,则 5,6,7和max为8 个字符。因为我想生成短令牌以供用户阅读。

标记应如下所示:1aYc,ZoXq,3iU9等

我不想向用户显示任何序列。

还有一件事,我的应用程序将由多个用户使用,因此如果两个用户同时点击生成令牌,PHP应用程序是否会生成相同的令牌(我假设我们使用时间戳生成令牌)?我们怎样才能防止这个问题?

感谢您的帮助!

4 个答案:

答案 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;
    }