为数据库条目生成不可预测的短字母数字id的更好方法

时间:2016-08-01 09:52:04

标签: random md5 yellow-pages

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

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

1 个答案:

答案 0 :(得分:0)

您不仅希望它们不可预测,而且也是唯一的。

这是一种技术:随机提出两个非常大的素数。称他们为 p q q 必须大于 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小提琴的页面,用于演示:https://dotnetfiddle.net/oUkbvy