7

オブジェクトを表すために一意の6桁のコードを必要とするシステムがあり、それらを生成するための優れたアルゴリズムを考えようとしています。前提条件は次のとおりです。

  • 私は基数20のシステムを使用しています(混乱やいたずらな言葉を防ぐために、キャップ、数字、母音、またはlは使用していません)
    • ベース20は6400万の組み合わせを可能にします
  • 一度に5〜1万のエントリを挿入する可能性があるため、理論的には一括挿入を使用します。つまり、一意のキーを使用すると、効率的またはきれいではない可能性があります(特に衝突が多く発生し始めた場合)。
  • 組み合わせの10%を埋めることは問題外ではないので、多くの衝突の可能性が高くなります
  • コードが連続していないことを確認したい

私はそれがうまくいくように聞こえるという考えを持っていましたが、それを実装する方法を理解するのに十分な数学がありません。いずれかを繰り返す前に、0〜63,999,999の各値をカウントできるNの値になります。

たとえば、N = 3(つまり、10 mod 3)を使用して0から9に移動すると、0、3、6、9、2、5、8、1、4、7になります。

繰り返さずに全範囲を数えることができるいくつかのより大きな数のNの値を計算するための魔法の数学の方法はありますか?理想的には、私が選んだ数字は、パターンがあることが明らかではないようにセットを飛び回るようなものですが、それがどれほど可能かはわかりません。

あるいは、0〜6400万の値の一意性を保証するハッシュアルゴリズムも機能しますが、それが可能かどうかを知るにはあまりにも愚かです。

4

6 に答える 6

8

必要なのは、キースペースと要素を共有しない番号だけです。最も簡単な値は素数を使用することです。大きな素数をグーグルで検索するか、http://primes.utm.edu/lists/small/10000.txtを使用できます

于 2009-08-10T23:48:17.700 に答える
1

素数を使用せずに(特別に構築されたシフトレジスタを使用して生成できる最大長のシーケンスを使用して)、同様の結果を取得する別の方法があります(繰り返しなしで、非連続的に値のセット全体をジャンプします)。

于 2009-08-11T00:21:09.810 に答える
1

シーケンスの長さの要因ではない素数は、繰り返さずにシーケンスにまたがることができる必要があります。64000000の場合、これは2または5を使用しないことを意味します。もちろん、それらを連続して生成したくない場合は、2または5を離して生成することもおそらくあまり良くありません。私は個人的に番号73973が好きです!

于 2009-08-10T23:50:35.573 に答える
0

私の数学は少し錆びていますが、Nと6400万のGCFが1であることを確認する必要があると思います。念のために素数(6400万に均等に分割されない)を使用します。

于 2009-08-10T23:50:02.593 に答える
0

@ニックルイス:

まあ、素数が6400万を割らない場合にのみ。したがって、質問者の目的のために、2または5のような数字はおそらくお勧めできません。

于 2009-08-10T23:52:02.340 に答える
-3

車輪の再発明をしないでください:http: //en.wikipedia.org/wiki/Universally_Unique_Identifier

于 2009-08-10T23:51:30.483 に答える