独特的Alpha数字生成器

时间:2010-12-22 22:08:38

标签: php mysql database numbers

我想为数据库中的用户提供唯一的字母数字ID。我使用下面的代码,这将始终生成一个唯一的ID?以下是代码的更新版本:

旧的php:

// Generate Guid 
function NewGuid() { 
    $s = strtoupper(md5(uniqid(rand(),true))); 
    $guidText = 
        substr($s,0,8) . '-' . 
        substr($s,8,4) . '-' . 
        substr($s,12,4). '-' . 
        substr($s,16,4). '-' . 
        substr($s,20); 
    return $guidText;
}
// End Generate Guid 

$Guid = NewGuid();
echo $Guid;
echo "<br><br><br>";

新PHP:

// Generate Guid 
function NewGuid() { 
    $s = strtoupper(uniqid("something",true)); 
    $guidText = 
        substr($s,0,8) . '-' . 
        substr($s,8,4) . '-' . 
        substr($s,12,4). '-' . 
        substr($s,16,4). '-' . 
        substr($s,20); 
    return $guidText;
}
// End Generate Guid 

$Guid = NewGuid();
echo $Guid;
echo "<br><br><br>";

第二个(新的php)代码是否保证100%唯一性。

最终代码:

PHP

// Generate Guid 
function NewGuid() { 
    $s = strtoupper(uniqid(rand(),true)); 
    $guidText = 
        substr($s,0,8) . '-' . 
        substr($s,8,4) . '-' . 
        substr($s,12,4). '-' . 
        substr($s,16,4). '-' . 
        substr($s,20); 
    return $guidText;
}
// End Generate Guid 

$Guid = NewGuid();
echo $Guid;

$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';    

function base_encode($num, $alphabet) {
    $base_count = strlen($alphabet);
    $encoded = '';

    while ($num >= $base_count) {

        $div = $num/$base_count;
        $mod = ($num-($base_count*intval($div)));
        $encoded = $alphabet[$mod] . $encoded;
        $num = intval($div);
    }

    if ($num) $encoded = $alphabet[$num] . $encoded;
        return $encoded;
}


function base_decode($num, $alphabet) {
    $decoded = 0;
    $multi = 1;

    while (strlen($num) > 0) {
        $digit = $num[strlen($num)-1];
        $decoded += $multi * strpos($alphabet, $digit);
        $multi = $multi * strlen($alphabet);
        $num = substr($num, 0, -1);
    }

    return $decoded;
}

echo base_encode($Guid, $alphabet); 

}

因此,为了更强大的唯一性,我使用$ Guid作为密钥生成器。那应该没问题呢?

4 个答案:

答案 0 :(得分:3)

如果您希望ID唯一,则应generate a GUID using uniqid

您的方法根本不能保证唯一性。并且可能会造成碰撞。

答案 1 :(得分:2)

下面的代码会从数字生成一个唯一的字母数字ID。我从Flickr groups拿走了它。编码和解码的两个功能:

$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';    

function base_encode($num, $alphabet) {
    $base_count = strlen($alphabet);
    $encoded = '';

    while ($num >= $base_count) {

        $div = $num/$base_count;
        $mod = ($num-($base_count*intval($div)));
        $encoded = $alphabet[$mod] . $encoded;
        $num = intval($div);
    }

    if ($num) $encoded = $alphabet[$num] . $encoded;
        return $encoded;
}

function base_decode($num, $alphabet) {
    $decoded = 0;
    $multi = 1;

    while (strlen($num) > 0) {
        $digit = $num[strlen($num)-1];
        $decoded += $multi * strpos($alphabet, $digit);
        $multi = $multi * strlen($alphabet);
        $num = substr($num, 0, -1);
    }

    return $decoded;
}

<强>更新

用法:

echo base_encode(123456789, $alphabet); //should output: bUKpk

答案 2 :(得分:2)

uniqid:<?php $substr = substr(md5(rand()),0,22);echo " $substr ";?>

答案 3 :(得分:1)

如果它真的是随机的,那么你不能保证唯一性(除非你继续生成随机密钥并在你找到新的数据库之前检查它们,这是一个可怕的想法)。

它真的需要随机吗?

为什么不在表中使用自动增量列,如果要将其作为字母数字值引用,则将其转换为base-62(或左右)?