2

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

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

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

4

3 回答 3

0

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

你不会有 colisions 或 loops 来检查 id 之前是否使用过。

于 2013-09-24T21:31:21.787 回答
0

我找到了更好的解决方案。我所需要的只是打乱字母表 [a-zA-Z0-9],这样访问者就无法迭代 URL。至少不会像以前那么容易了。

于 2013-09-26T12:49:47.593 回答
0

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

具体例子:

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),之后循环重复。

当然,您将需要更大的pand q,以及 id 的偏移量,但原理肯定会起作用。

于 2013-09-24T21:29:23.557 回答