7

私が尋ねたら:どうやらランダムなクエリ文字列/URLがどのように生成されているのか。

それは多くの場所で見つけることができます:

http://www.youtube.com/watch?v=IMl7pvaWzh8
                                   ^
                                   |
                                   +---------------- 

http://jsfiddle.net/xeolabs/LSTKM/light/
                              ^
                              |
                              +---------------- 

http://jsbin.com/asapay/1/edit
                   ^
                   |
                   +---------------- 

サーバーが新しいURLを選択するとき、それが無料であるかどうかをチェックしないと言われました(そしてそれは論理的なようです)(以前は選択されていませんでした)

また、次のような式の結果である可能性があると言われました:( f(n+1) = f(n)+1したがって、ランダムではありません。

したがって、最後に生成されたurl paramの結果として、新しいurlparamが生成されます。

私の質問 :

そのようなジェネレーター関数はどこにありますか?

もちろん、私はそのような17 = 16 + 1のようなものの1つを構築することができますが、私は次のような準備ができているものを探しています:

f(n+1) = f(n)+1大文字、小文字、数字の用法がある場合。そして
もちろん、最小の衝突とゼロの予測。

あなたが知っている、何か専門家...

google / youtube / jsbin/jsfiddleが1日に何百万ものリクエストを処理する方法に興味があります。

4

5 に答える 5

2

大声で考えますが、一意のハッシュの膨大なリストを事前に計算して、それらを新しい入力に割り当てることができます。事前計算により、リアルタイムで必要とされないため、衝突をチェックし続けることができます。この質問では、ランダムハッシュの生成を調べることができます。

于 2012-12-23T20:35:54.730 に答える
0

(私が自分で使用した)1つの解決策はこれである可能性があります:

要件:連続番号が増加するための一意のソース(OracleのシーケンスやSQL Serverの自動増分インデックスなど)-このような増分ソースを生成するために確実に処理できるもの。

すべての新しいURL(または必要なもの)を生成するためのワークフロー:1-シーケンスの次の値を取得します。2-ベース36の数値に変換します(このようにC#での実装をグーグルで検索できます)。3-URLで生成されたベース36の番号を使用します(またはデータベースの変更など、何をしていても)。

36進数に関する注意:私たちは日常業務で10桁からなる10進法を使用しています。コンピューターでは、16桁(0〜9とA、B、C、D、E、およびF)で生成される16進数を使用します。現在、36桁を使用して作成されたベース36システムもあります。0〜9およびAZおよびすべての数字は英数字です。そのため、URLで簡単に使用できます。ウィキペディアのページの例:10進数の2,821,109,907,456は、36進数のCRE66I9Sになります。

于 2012-12-23T21:32:55.587 に答える
0

これは特定の質問に正確に答えることはできませんが、一意で予測不可能な文字列を返す関数が必要な場合は、次の1つがあります。

Guid.NewGuid().ToString()

さまざまなシナリオで一意のクエリ文字列を形成するためによく使用します。

于 2012-12-23T20:34:23.203 に答える
0

System.IOランダムなファイル名ジェネレータがあり、おそらくそれを乗っ取ることができます。

string randomString = System.IO.Path.GetFileNameWithoutExtension(System.IO.Path.GetRandomFileName());

「jdvpmpre」のようなものを返します

あなたはそれをよりユニークにするために一緒にカップルを結合することができます、しかしこれは速くて簡単な解決策でしょう。

于 2012-12-23T20:46:16.043 に答える
0

私のコメントを続けて、
入力を受け取り、一意のトークンを生成している場所がいくつかあると仮定すると、範囲を分割できると言いました。たとえば、イスラエルに1つのサイトがあり、米国に1つのサイトがあり、両方で一意のトークンを生成したい場合(これらのサイトで生成されたトークン間でオーバーラップしたくない場合)、一意のデータベースを使用して現在のトークンを保存できます。トークン値。

(1)これがシナリオです。dbは値1のトークンで始まります。
(2)イスラエルのサイトはdbにいくつかの新しいトークンを取得するように要求します。dbはそれに1から1000の範囲を与えます(トークンではなく範囲)。このように、イスラエルのサイトは、1000個のトークンをすべて使い切るまで、新しいリクエストを取得するたびにデータベースに戻る必要はありません。
(3)USAサイトはdbに移動し、トークンの1001〜2000の範囲を取得します。
(4)この例では、2つのコンシューマーと1つのプロデューサー(db)があります。他のコンシューマーをブロックしないように、データベースの使用をできるだけ少なくしたいという前提があります。したがって、各プロデューサーがdbに移動するのに1秒かかる場合、dbが各コンシューマーにいくつのIDを与える必要があります。答えは、消費者が使用するIDの数/1秒*消費者の数です。このようにして、コンシューマーは、データベースが解放されるのを互いに待って行き詰まることはありません。

では、それらのプロデューサーはどのように範囲を利用するのでしょうか?カウンターをインクリメントすることで、データベースから受け取った範囲のベース72トークンを生成できます。なぜベース72?それは多数の短いトークンを与えるからです。72を思い付くために、私はaz、AZ、0-9、0-9キーの特殊文字を使用しました:25 + 25 + 10+10。あなたは72より高く行くことができます。

セッショントークンの実装は、
https ://github.com/hoytech/Session-Tokenにあります。

役立つかもしれないこの質問もあります:
ランダムな英数字の文字列を生成する方法は?

于 2012-12-23T21:38:20.053 に答える