-1

すべての行が一意のID(RowID)を持つデータベーステーブルがあります。

このRowIDを常に6文字の長さの一意のキーに変換する良い方法はありますか。一意のキー文字は{A-Za-z0-9}にすることができます。一意のキーの1つの例は、a5Fg3Aです。

もちろん、この方法を使用して生成できるキーの数は限られていることはわかっていますが、私の場合は問題ではありません。

私はこれについてよく考えましたが、これを適切に行うことができるアルゴリズムを思い付くことができません。

私が持っていたアイデアの1つは次のとおりです。一意キー=RowIDRowIDが100000未満の場合、その前に0を追加します。例:123は000123になります1は000001になります

次に、100000から900000の範囲の数値の場合、最初の数値を文字列に置き換えます。たとえば、0 = a、1 = b、2 = c、...、9=jです。

そうすれば、大文字などでも同じことができます。

私の問題は、アルゴリズムが非常に制限されており、可能なすべての文字を使用しないため、生成されるキーの数が少ないことです。

したがって、基本的に、すべてのキーの長さが6であり、次の文字を使用すると仮定して、56800235584の一意のキーを生成できるはずです:{A-Za-z0-9}。

AZ=26文字az=26文字0-9=10文字

つまり、62^6の一意のキーです。

これを適切に(または最適に)行う方法についてのフィードバックをいただければ幸いです:-)

ありがとう!

4

3 に答える 3

2

IDを並べ替えてから、それぞれに増加する辞書式文字列を添付できます。

あなたのアルファベットが{a,b}(単純化のためだけに)のみである単純な例、そしてIds= [20,1,7,90]

sort: Ids = [1,7,20,90]
Attach increasing strings:
1 =  aaaaaa
7 =  aaaaab
20 = aaaaba
90 = 0000bb

データに依存せず、ある種のハッシュ関数として使用したい場合は、数値に使用されているのと同じバイナリエンコーディングを使用して、同様に変換できます(つまり、1 = aaaaaa、2 = aaaaab、3 =aaaaac)。 ..)
[編集:基本的に@HighPerformanceMarkがコメントで提案したbase-62と同じ]


最初のアプローチの利点:サイズに関係なく、最大62 ^ 6の数値を処理できますが、2番目のアプローチでは処理できません。

ただし、2番目のアプローチでは、特定のデータに関係なく、数値から文字列への一貫した変換が可能です。

于 2012-12-12T15:13:52.840 に答える
1

AZ az 0-9をアルファベットにしたい場合は、ベース62の記数法を使用していることに気づきました。したがって、ベース62で一意のROWIDをエンコードします。これを行うための、標準のアルゴリズムがあります。アプリケーションで許可されている(必要な場合)場合は、「+」、「/」、「!」、「@」などの印刷可能な文字をさらにいくつか追加して、より多くの一意性を得ることができます。既成の答えは、広く使用されているbase64エンコーディングです。

于 2012-12-12T15:21:12.930 に答える
0

これを行うには多くの方法があります。課題は、基準が何であれ、「最良」のものを選択することです。いくつかの例ですが、網羅的ではありません(すでに他の場所で提案されているものもあります):

  • シーケンスが増加するパッド
  • base-62表現(注:base-64は一般的に使用されており、手元にあるライブラリですでにコードを使用できる場合もあります)
  • 切り捨てられた暗号化ハッシュ(遅いですが、これを行う必要がある理由に応じて、役立つ可能性のある他のプロパティがいくつかあります。一度だけ行う必要がある場合は、パフォーマンスへの影響はそれだけの価値があります)
  • かなり高速になる可能性のある他の必ずしも暗号化されていないハッシュ関数
  • .....。
于 2012-12-12T15:24:28.227 に答える