【问题标题】:is this enough for a user id uniqueness? [closed]这足以满足用户 ID 的唯一性吗? [关闭]
【发布时间】:2021-06-30 14:38:11
【问题描述】:

我正在做我的第一个真正的项目,我有点担心。我正在尝试创建一个唯一的用户 ID(我正在使用 PHP 和 mysql)。我对这个话题做了一些研究,老实说,我不知所措。我读到的最后一件事是关于一个叫做 uniqid() 的东西,但是文章说 [这个函数不保证返回值的唯一性。由于大多数系统通过NTP或类似的方式调整系统时钟,因此系统时间不断变化... Source PHP manual]。然后我考虑添加一个随机前缀,并在下面提供了这段代码。一个唯一的用户 ID 就足够了吗?

<?php

$sub = substr(str_shuffle('AQWZSXEDCRFVTGBYHNUJIKOLMP'),16); // returns the last 10 chars
$shuff = str_shuffle(strval(rand(1000,9999)).$sub); // shuffle the 10 random chars with 4 random number
$user_id = uniqid($shuff);

【问题讨论】:

  • 我的票投给mysql主键
  • 使用具有 AutoIncrement 的 id 列,该列至少对该表来说始终是唯一的
  • uniqid() 不保证唯一性,但如果你省略它的 $more_entropy 第二个参数,那就太糟糕了。我从来没有在一个值不是由数据库引擎生成的项目中工作过,但是,如果你选择 PHP 路线,你可以找到一个有信誉的 UUID 库......或使用序号:1、2、3.. . :)
  • 如果您只想生成随机的字母数字字符串,请查看random_bytes()。如果长度足够长(比如 32+),那么生成重复项的可能性非常小(虽然不是说不可能),但是如果您需要 100% 唯一的用户 ID,那么您应该按照其他人的建议进行操作,使用自动递增的主改为键入您的数据库。

标签: php mysql unique


【解决方案1】:

为了完整且有保证的唯一性,我建议使用上面建议的 AutoIncrement。通过代码生成的任何“随机”都不是真正随机的,因此不能保证您是唯一标识符。

【讨论】:

  • 请将 uuidv4 添加到您的答案中,因为有时无法选择大整数
【解决方案2】:

不,永远不会 100% 保证唯一性。没错。

但你应该问的问题不应该是“它是否独特?”,而应该问“它足够独特吗?”。

要在表中拥有唯一的 id,请获取可以找到的最大数字 + 1。通常,数据库系统会使用自动递增 id 为您执行此操作。这在此表的上下文中足够独特,但可能不够独特,无法与其他数据源一起使用。

如果您想在多个位置保持唯一性,请在其前面加上位置的 id 等。

老实说,我没有遇到任何不够独特的情况。

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多