生成一个独特的tinyurl-like ID但随机(不是mysql行id到base64)

时间:2013-09-24 21:22:09

标签: php sql url hash tinyurl

我需要生成像tinyurl这样的唯一网址:domain.com/pgDzs7,domain.com/ab4dh3 但是(!)问题是我不希望用户只通过更改URL中的最后一个字母来查看上一个和下一个URL。

例如,如果有人创建了一个获取URL domain.com/pgDzs7的内容,我希望下一个访问者获得一个绝对不同的唯一URL(例如,“ab4dh3”),这样就没有人无法知道这些URL是如何产生的已生成并查看其他用户的内容,除非他们知道其URL。

我在Stackoverflow上找到的所有内容都是将表的主要整数键转换为base64形式。但我需要不同的解决方案,它也不会产生冲突,也没有for / while循环(如果可能的话),因为我的MySQL表有几十GB。

3 个答案:

答案 0 :(得分:0)

您可以使用模幂运算将键映射到不同的键,您可以轻松地将其映射回原始键,利用模幂运算的一些特殊属性,其中模数的形式为p*q p }和q素数。

具体例子:

p=31
q=17
a=343
b=7

such that (a*b) = 1 mod (p-1)*(q-1)

given original secret index "id", you have public index "pid"

pid = id ^ a mod p*q

and given the public id "pid" you can find the secret id

id = pid ^ b mod p*q

这将生成下表:

id      pid     recovered_id
0       0       0
1       1       1
2       349     2
3       334     3
4       64      4
5       129     5
6       99      6
7       267     7
8       202     8
9       359     9
10      226     10
11      207     11
12      296     12
13      259     13
etc

直到最大id为p * q-1(526),之后循环重复。

对于cource,您需要更大的pq以及ID的偏移量,但原则肯定会有效。

答案 1 :(得分:0)

您可以制作公式以获取下一个索引。 喜欢:LastID * 2 + 5

您不会使用colisions或循环来检查之前是否使用过id。

答案 2 :(得分:0)

我找到了更好的解决方案。我需要的是将字母[a-zA-Z0-9]改组,以便访问者无法迭代URL。至少它不会像以前那么容易。