PHP和条令:如何创建唯一ID
我想创建唯一的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()不能保证生成值的唯一性。我认为冲突非常罕见,但无论如何,根本没有被排除在外,所以我不认为它是“安全的”(冲突可能会导致异常,而行创建
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有技术意义,但我只是想把它作为一个唯一的值来标识一个实体,而不受长度、格式或任何其他方面的限制。就这个问题而言,它的独特性就是它的独特性。