Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和条令:如何创建唯一ID_Php_Mysql_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

PHP和条令:如何创建唯一ID

PHP和条令:如何创建唯一ID,php,mysql,symfony,doctrine-orm,doctrine,Php,Mysql,Symfony,Doctrine Orm,Doctrine,我想创建唯一的ID,比如dujUSJue9389sjgjik 我使用了该条令的UUID策略来创建它们,但结果类似于d9c363ae-a1b7-11e6-a66d-9e9923e30d94:我不喜欢使用破折号,而且我希望ID更短 他们必须识别一些实体来构建像http://example.com/entity/hduicw43tv43bic 使用PHP的uniqid()不能保证生成值的唯一性。我认为冲突非常罕见,但无论如何,根本没有被排除在外,所以我不认为它是“安全的”(冲突可能会导致异常,而行创建

我想创建唯一的ID,比如
dujUSJue9389sjgjik

我使用了该条令的
UUID
策略来创建它们,但结果类似于
d9c363ae-a1b7-11e6-a66d-9e9923e30d94
:我不喜欢使用破折号,而且我希望ID更短

他们必须识别一些实体来构建像
http://example.com/entity/hduicw43tv43bic

使用PHP的
uniqid()
不能保证生成值的唯一性。我认为冲突非常罕见,但无论如何,根本没有被排除在外,所以我不认为它是“安全的”(冲突可能会导致异常,而行创建可能会导致很多头痛的问题)

因此,使用Doctrine和Symfony,我正在寻找一种方法来生成一个值,如
ajbuybdb74883bj8d74nj
,并检查其唯一性。如果已经存在,则必须生成新值。一旦实体具有唯一值,就可以将其持久化。创建实体时应生成实体


关于如何实现这一点有什么想法吗?

如果条令的UUID策略很好,您可以简单地将其转化为:

$in = 'd9c363ae-a1b7-11e6-a66d-9e9923e30d94';
$out = base_convert(strtr($in,'-',''),16,36);
print_r($out);
简短、无破折号、可反转

我建议您使用该库,具体使用如下:

$uuid = \Ramsey\Uuid\Uuid::uuid4();
echo $uuid->getHex();
或者,如果您已经拥有UUID,则可以执行以下操作:

$uuid = \Ramsey\Uuid\Uuid::fromString('f6a1fd62-1445-42fc-9e7b-d8c6e9da33a1');
echo $uuid->getHex();
更多信息


希望这个帮助是一个很好的起点。还有安东尼的图书馆

但是要注意uuid,它们可能会损坏您的数据!此外,如果该id已在数据库中,则无法使用select进行检查。如果两个用户同时创建两个记录,他们可以获得相同的id。

因此,混合了@Jakub Matczak和@Jakub Matczak的建议,我得出了以下结论:

class Company
{
    /**
     * @var string
     *
     * @ORM\Column(name="id", type="string")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="CUSTOM")
     * @ORM\CustomIdGenerator(class="AppBundle\Doctrine\IdGenerator")
     */
     private $id;

     ...
然后

namespace AppBundle\Doctrine;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Id\AbstractIdGenerator;
use Ramsey\Uuid\Uuid;

/**
 * {@inheritdoc}
 */
class IdGenerator extends AbstractIdGenerator
{
    /**
     * {@inheritdoc}
     */
    public function generate(EntityManager $em, $entity)
    {
        $uuid = Uuid::uuid4()->getHex();

        if (null !== $em->getRepository(get_class($entity))->findOneBy(['id' => $uuid])) {
            $uuid = $this->generate($em, $entity);
        }

        return $uuid;
    }
}
该生成器还检查具有相同名称的现有实体,根据需要重新生成UUID并保证唯一性


生成的值正是我想要的:
7b165049eb224f548021f68caefc57f6

没有真正的唯一值生成算法来保证唯一性,包括UUID/GUID。是的,我知道这一点。为此,我正在寻找一个过程来检查唯一性,并在失败时(生成的ID已经存在)重新生成它。这应该在实体本身中完成。这应该在实体本身中完成。检查其他实体(包括调用存储库)不是实体的工作。这应该是ID生成器的工作。您可以尝试创建自定义ID生成器,但我找不到有关它的文档。无论如何,这里有一个关于Psyloss答案的例子:UUID只是一个数字。您可以将其显示为带有插入连字符的十六进制文本,但它仍然是128位的值。你可以表示为你想要的(例如:base64编码)@Federkun,是的,当然,但我不希望它太长。。。也许UUID有技术意义,但我只是想把它作为一个唯一的值来标识一个实体,而不受长度、格式或任何其他方面的限制。就这个问题而言,它的独特性就是它的独特性。