2016-09-07 15 views
-4

2つのユニークな英数字の文字列から長さ28のユニークな英数字の文字列を生成したい。 2つのユニークな文字列から衝突のない文字列を持つことは数学的に可能ですか?ここ長さ28のユニークな文字列から長さ28のユニークな文字列を生成する方法は?

は、私は上記のコードでは

ASCII_NUMBER_RANGE_START = 48; 
ASCII_ALPHABET_RANGE_START =55; 

for (int i = 0; i < firstArray.length; i++) { 
     int tempASCIIValue = (Character.getNumericValue(firstArray[i]) + Character.getNumericValue(secondArray[i])) % 35; 
     if (tempASCIIValue <= 9) { 
      FINAL_ASCII_VALUE = tempASCIIValue + ASCII_NUMBER_RANGE_START; 
     } else { 
      FINAL_ASCII_VALUE = tempASCIIValue + ASCII_ALPHABET_RANGE_START; 
     } 
     combinedArray[i] = (char) FINAL_ASCII_VALUE; 
    } 
    return new String(combinedArray); 
} 

をやったことですが、私は結果の文字列が一意として強い親の文字列としてであるかどうかを確認していません。

注:すべてのヘルプは高く評価され

親の文字列と同じ長さを持つために生成された文字列。ありがとう。

+0

あなたは何を試しましたか? – Amy

+0

言い換えれば、連結(ユニークA、ユニークB)は常にユニークな文字列リテラルになります。 – tpk

+0

このリンクを試す - http://www.javapractices.com/topic/TopicAction.do?Id=56 – tpk

答えて

1

衝突が避けられないとすれば、ハッシュコード生成のようなアイデアを見ることができます。ハッシュテーブルでは、オブジェクトごとにハッシュコードを生成する必要があります。理想的にはPerfect hash functionが必要ですが、実装するのは非常に難しいことです。

あなたは離れて、ハッシュ関数で取得する例Best implementation for hashCode methodを参照することができるかもしれません。 2つの整数の変数を持つシンプルなものを使用すると、文字で動作するようにこれを変更することができ、あなたの実装では

int generateHashCode(int a,int b) { 
    // Start with a non-zero constant. Prime is preferred 
    int result = 17; 
    // For each field multiply the previous result by a prime and add 
    result = 31 * result + a;   
    result = 31 * result + b;   
    return result; 
} 

です。あるキャラクターを失うことができれば、各キャラクターに26 + 26 + 9 = 64の可能性が与えられます。つまり、各文字に6ビット、入力全体に168ビットを使用できます。これは6つの整数に収まることができます。次に、整数の各ペアに対してgenerateHashCode()メソッドを実行します。

+0

サポートに感謝しますか? –

0

StringBuilder/StringBufferを使用して文字列uid(28桁の英数字)を追加し、concatinated StringをSetの実装に入れることができます。設定されている実装は、重複している要素があればそれを除外します。ここで

は、サンプルコードです:

import java.util.LinkedHashSet; 

public class Delete1 { 
    public static void main(String[] args) { 
     LinkedHashSet<String> impl=new LinkedHashSet<String>(); 
     for (int i = 0; i < 5; i++) { 
      String uid1="[email protected]#$%^&"; 
      String uid2="[email protected]#$%^&"; 
      StringBuilder builder=new StringBuilder(); 
      builder.append(uid1); 
      builder.append(uid2); 
      impl.add(builder.toString()); 
     } 
     for (String value : impl) { 
      System.out.println(value); 
     } 
    } 
} 

ループが5回反復されるが、出力は

[email protected]#$%^&[email protected]#$%^& 

ですがあなたは一意のIDを作成するためにあなたのループ変数を追加することができます。

+0

あなたの努力のおかげで、私はそれを試してみましょう –

+0

実際に両方の文字列のconcatinationを得て、私はそれが親の文字列の長さと同じ長さにする必要があります。 –

+0

@Sayakの場合、生成される文字列の長さは28 – tpk

関連する問題