2

tinyurl のような一意の URL を生成する必要があります: domain.com/pgDzs7、domain.com/ab4dh3 しかし (!) 問題は、ユーザーが最後の文字を変更するだけで前の URL と次の URL を表示できるようにしたくないことです。 URL。

たとえば、誰かが domain.com/pgDzs7 という URL を取得するコンテンツを作成した場合、次の訪問者にはまったく別の一意の URL (たとえば、「ab4dh3」) を取得してもらいたいので、これらの URL がどのように生成されたかをだれも知ることができず、 URL を知らない限り、他のユーザーのコンテンツを見ることはできません。

ここ Stackoverflow で見つけたのは、テーブルのプライマリ整数キーを base64 形式に変換することだけです。しかし、MySQL テーブルには数十 GByte あるため、衝突を生成せず、for/while サイクル (可能な場合) を持たない別のソリューションが必要です。

4

3 に答える 3

0

剰余累乗を使用してキーを別のキーにマップできます。これは元のキーに簡単にマップし直すことができ、剰余がと素数の形式p*qを持つ剰余累乗のいくつかの特別なプロパティを利用できます。pq

具体例:

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

p*q-1 (526) の最大 ID まで、その後はサイクルが繰り返されます。

もちろん、はるかに大きなpand q、および id へのオフセットが必要になりますが、原則は確実に機能します。

于 2013-09-24T21:29:23.557 に答える
0

より良い解決策を見つけました。アルファベット [a-zA-Z0-9] をシャッフルするだけで、訪問者が URL を繰り返すことができなくなります。少なくとも、以前ほど簡単ではないでしょう。

于 2013-09-26T12:49:47.593 に答える