【问题标题】:How to generate random looking unique identifiers that match a given pattern如何生成与给定模式匹配的随机外观唯一标识符
【发布时间】:2016-10-14 17:08:15
【问题描述】:

我有一个users 表,我需要为每个用户创建一个独特的、随机的字母数字“id”(他们已经像往常一样拥有自动递增的 id)。此标识符必须:

  • 与众不同
  • 随便看看
  • 匹配模式AAAA-1234(4个字母,4个数字)

有没有比一直随机生成字符串直到我找到一个不在数据库中的字符串更好的方法?

【问题讨论】:

  • 当您说“随机查找”时,您的意思是这些数字不应该是必然的吗?
  • @PavelPetrov 完全正确
  • 可能您需要的算法类似于生成信用卡号码的算法。如果您在 Cryptography SE 中提出这个问题,您可能会得到更好的答案。
  • @PavelPetrov 我不认为它属于那里,这是一个算法问题而不是密码学问题
  • 我想问题是,你愿意花多少时间和精力让它看起来很可爱,而这与正常的风险厌恶建议不同(即:你目前正在做的事情已经足够好了)。毕竟,工作确实会变得无聊,我们只是为自己创造愚蠢的工作,不是吗。

标签: php mysql random unique identifier


【解决方案1】:

以无聊的旧顺序为每个用户分配一个整数(或使用您提到的其他 id)。叫它$x

设置$x = (($x + 2135587861) * 2654435769) & 0xffffffff

设置$x = $x ^ ($x >> 15)

再次设置$x = (($x + 2135587861) * 2654435769) & 0xffffffff

计算 $x % 26 并根据结果选择字母 a-z。设置$x = $x / 26。重复四次(我不懂 PHP,所以你在这里得到口头说明)。

计算$x % 10并根据结果选择一个数字0-9。设置$x = $x / 10。重复四次。

我得到的前六个结果是:

HSQG-2102
DNQO-1176
TEKJ-5435
EHWX-6540
UPPH-0450
MVIX-5036

它并不完全完美,但并不明显。或许这就够了。

此外,它仅适用于发生冲突之前的前 40 亿(ish)用户,但这与字符串格式的限制还有一点距离。

【讨论】:

  • 我不太了解这里的数字,但如果我没看错的话,这基本上意味着每个 $x 将映射到一个字符串,这将是唯一的,直到 $x
  • 是的,它们是唯一的,直到该限制。所有的神奇数字都是任意的,我只是选择了一些似乎有效的数字。我使用了黄金比例的前 64 位。唯一的限制是乘数必须是奇数——这具有数学特性,即使在& 0xffffffff 之后,每个可能的输入都映射到唯一的输出。由于所有操作都具有相同的属性,因此我们知道我们不会将任何两个输入折叠到相同的输出(碰撞)中,并且理论上我们可以反转操作以发现原始数字。
  • 感谢您的解释!
猜你喜欢
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2010-09-26
  • 1970-01-01
相关资源
最近更新 更多