我需要生成像tinyurl这样的唯一网址:domain.com/pgDzs7,domain.com/ab4dh3 但是(!)问题是我不希望用户只通过更改URL中的最后一个字母来查看上一个和下一个URL。
例如,如果有人创建了一个获取URL domain.com/pgDzs7的内容,我希望下一个访问者获得一个绝对不同的唯一URL(例如,“ab4dh3”),这样就没有人无法知道这些URL是如何产生的已生成并查看其他用户的内容,除非他们知道其URL。
我在Stackoverflow上找到的所有内容都是将表的主要整数键转换为base64形式。但我需要不同的解决方案,它也不会产生冲突,也没有for / while循环(如果可能的话),因为我的MySQL表有几十GB。
答案 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,您需要更大的p
和q
以及ID的偏移量,但原则肯定会有效。
答案 1 :(得分:0)
您可以制作公式以获取下一个索引。 喜欢:LastID * 2 + 5
您不会使用colisions或循环来检查之前是否使用过id。
答案 2 :(得分:0)
我找到了更好的解决方案。我需要的是将字母[a-zA-Z0-9]改组,以便访问者无法迭代URL。至少它不会像以前那么容易。