【问题标题】:Better way of generating unpredictable, short alphanumeric id for database entries为数据库条目生成不可预测的短字母数字 ID 的更好方法
【发布时间】:2016-12-06 08:32:11
【问题描述】:

我正在开发一个拥有大约 100 万个条目的黄页网站。我目前正在使用随机 md5 哈希作为 id,但认为这是一个坏主意(更长,消耗更多空间)。

除了使用uniqid() 函数之外,还有什么更好的方法可以在PHP 中生成不可预测的、随机的、短字母数字ID。我没有使用自动增量 ID、base64 等,因为数据抓取非常容易。

【问题讨论】:

  • “8Lac 条目”是什么意思?
  • 作为一个黄页网站,该表有大约 80 万条企业名称、地址、电话号码、电子邮件和其他详细信息
  • openssl_random_pseudo_bytes() ?

标签: random md5 yellow-pages


【解决方案1】:

您不仅希望它们是不可预测的,而且是独一无二的。

这里有一个技巧:随机得出两个非常大的素数。称它们为 pqq 必须大于 p。对这些数字保密,因为从现在起您将使用它们作为您的密钥生成器。

每次要生成新标识符时:

  • n = (number_of_rows) + 1;
  • id = p^(n) MOD q

大多数大型库都有powermod 方法,所以它会是

 let n = (number_of_rows) + 1;
 let id = powermod(l, n, m);

如果,对于我的素数,我选择了

p = 533000401
q = 553105243

然后

533000401^1 mod 553105243 = 533000401
533000401^2 mod 553105243 = 338207751
533000401^3 mod 553105243 = 288526476
533000401^4 mod 553105243 = 520004588
533000401^5 mod 553105243 = 485019742
533000401^6 mod 553105243 = 154299236
533000401^7 mod 553105243 = 345441135
533000401^8 mod 553105243 = 548307409
533000401^9 mod 553105243 = 352554000
533000401^10 mod 553105243 = 116366514
533000401^11 mod 553105243 = 262938285
533000401^12 mod 553105243 = 551979652
533000401^13 mod 553105243 = 81299520
533000401^14 mod 553105243 = 485628040
533000401^15 mod 553105243 = 129148293
533000401^16 mod 553105243 = 77088382
533000401^17 mod 553105243 = 377106983
533000401^18 mod 553105243 = 533584982
533000401^19 mod 553105243 = 362875056
533000401^20 mod 553105243 = 432282485

即使它看起来是随机的,也保证在达到 q

之前不会重复

当然,如果有人知道你的两个初始质数是什么,他们就能从前一个数中猜出下一个数,所以你必须对它们保密。但我不相信有办法计算出源数字是什么(只是尝试每对可能的素数,这将花费非常长的时间)。

这是 .NET fiddle 上的一个页面来演示这一点:https://dotnetfiddle.net/oUkbvy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多