2010-12-06 7 views
1

いくつかの値を指定すると、私は(独特の)独特の結果を作りたいと思います。フォールトトレランスで複数の値から一意のIDを生成

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plnmjfys')); 
//now $unique1 == "sqef3452y"; 

また、同じ結果を返すにはかなり近いものが必要です。この場合、値の20%が欠落しています。

$unique2 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8')); 
//also $unique2 == "sqef3452y"; 

私はこのようなアルゴリズムをどこから始めるべきかはわかりませんが、いくつかの前提があります。

  1. 私は複数の値が与えられたと仮定し、より正確な結果のIDが - 換言すれば、20個の値を使用して5
  2. よりも優れている私は、また、確信度を算出し、調整することができると仮定する。

「値1は値3よりも重要です」と言うことができる重み係数があります。これには、1次元の代わりに入力用の多次元配列が必要です。

私はちょうどこれらの値のためにキーボードをつぶしましたが、実際には短いか長いアルファ数値かもしれません。

+0

明確にしてください - あなたは私がランダムな値を作成しようとしていないよ」と言う私が開発しようとしている別のコメントで。常に等しいとは限らない情報のセットから同じ値を生成できるアルゴリズム」と定義されています。これはまさにポイントを逃していない限り、「いくつかの価値を考えれば、私は(独特の)結果を作りたい」ということとは正反対です。 –

+0

良い解決策は、入力データの分布に大きく依存します。おそらくあなたが解決しようとしている実際の問題を説明するのが最善でしょう。 – jcd

答えて

1

あなたの2つの要件は少し矛盾しているようです。配列の最後の20%が重要でない場合(つまり、 '0plnmjfys'に等しいかnullの場合に同じ結果を得たい場合)、なぜ最初にそれを含めるのですか?

最初のステップでは、明確にしたいものを明確にすることです。それが重要でない場合は、それをドロップしてください。

これを決定したら、2つの「近い」結果に「近い」IDがあると期待するかどうかを尋ねる必要があります。多分あなたは(あなたも、これらを見てみたいことがあります)、最もユニークなIDジェネレータがhashesを使用しているため、後者は、トリッキーです

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plnmjfys')); 
//now $unique1 == "sqef3452y"; 

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plSsa45')); 
//now $unique1 == "sqef3452k"; 

をしたいので、2つの非常によく似た文字列が乱暴に異なる結果を返すことができます。

一意性を保証し、結果に "親密さ"を持たせたくない場合は、連結された文字列のハッシュを計算するか、入力文字列ごとにハッシュを計算し、ハッシュコードを連結します。

「近さ」を特権にしたい場合は、最も関連性の高い部分のハッシュを計算し、関連性の低い残りの部分についてはSoundex algorithmなどを適用することができます。

この場合、矛盾する要件があることを覚えておいてください。一意のIDは、1000文字の文字列内の1文字だけが異なる場合でも、文字列に対して異なるコードを与えることを非常に難しくします。

近さ(この文字列は、この第二の文字列として「多かれ少なかれ同じ」である)正反対を実行しようとし、そして、できれば二人同じコードが返されます:Soundexのアルゴリズムに関するウィキペディアを引用:

このアルゴリズムを使用すると、 "Robert" と "Rupert"の両方が同じ文字列 "R163"を返し、 "Rubin"は "R150"を返します。 "Ashcraft"と "Ashcroft"はいずれも "A261"です。

だから...どちらですか?最初の4つの要素(あなたの例では)とSoundexのハッシュを使用して、あなたのサンプル作業で最も重要でない20%を考えていますか?これはおそらくのようなもので(バックあなたの例になって)しまう

$unique2 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8',)); 
//now $unique2 == "AB67R45-000000"; 

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plSsa45')); 
//now $unique2 == "AB67R45-012000"; 
+0

これは私の目的を達成するためにsoundexと英語の親密さを使用するのに非常に良い解決策です。 – ojreadmore

0

乱数ジェネレータ(RNG)、シード、乱数の度合いをお読みになることをお勧めします。

一般に、ほとんどのソフトウェアRNGはアルゴリズムを初期化するために「シード」と呼ばれる値を使用します。その後、生成された各乱数は、次の反復のためのシードとして使用される。つまり、常に同じシード(1や42など)を使用する場合は、同じシーケンスの「ランダム」番号が常に得られます。したがって、これらのタイプのRNGはしばしば「擬似ランダム」としか言われない。セキュリティ上の理由から、シード値は、現在のシステム時間(ミリ秒単位)やハードウェアランダム化デバイスなどを使用して選択されることが多いため、合理的な期間に同じシードを2回選択する機会を減らすことができます。

あなたが提案しているように見えるのは、おそらく重み付きで複数の文字列を取り込み、数式を使って種を計算できるRNGです。次に、シード済みのRNGを使用して、文字をランダムに選択して新しい文字列を作成します。興味深いですが、残念ながら、上で説明したように、数値シードと既存のRNGで始まるだけではなく、むしろ意味があります。しかし、エクササイズとして楽しいかもしれません!

http://en.wikipedia.org/wiki/Random_number_generation

また、ランダムな文字列を作成する上でより多くのリソースを見つけるために、「ランダムな文字列ジェネレータ」またはそのようないくつかのグーグルかもしれません。

+0

私はランダムな値を作成しようとしていません。私は常に同じではない情報のセットから同じ値を生成できるアルゴリズムを開発しようとしています。 – ojreadmore

+0

@ojreadmore:ああ、私はあなたの質問を誤解しています。 – DGH

関連する問題