0

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

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

4

1 回答 1

0

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

这里有一个技巧:随机得出两个非常大的素数。称他们为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

于 2016-08-01T10:00:03.140 回答