あなたの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";
明確にしてください - あなたは私がランダムな値を作成しようとしていないよ」と言う私が開発しようとしている別のコメントで。常に等しいとは限らない情報のセットから同じ値を生成できるアルゴリズム」と定義されています。これはまさにポイントを逃していない限り、「いくつかの価値を考えれば、私は(独特の)結果を作りたい」ということとは正反対です。 –
良い解決策は、入力データの分布に大きく依存します。おそらくあなたが解決しようとしている実際の問題を説明するのが最善でしょう。 – jcd