バイナリで528ビットレコードを保持するハッシュマップを作成する方法

StackOverflow https://stackoverflow.com/questions/5369233

  •  27-10-2019
  •  | 
  •  

質問

528ビットのバイナリデータを保持するハッシュマップを作成する必要があります。ハッシュマップにバイナリデータはどのように保存されますか?

例:00000001000000100000000 ...これは25ビットです。同様に、528ビットを保存する必要があります。

この値をバイト配列に変換する必要がありますか、それともデータをメモリに直接保存できますか?

例は非常に役立ちます。

役に立ちましたか?

解決

あなたの人生を複雑にしないでください。

仮定します value ofです String タイプして、次の場合は次のとおりです。

key なので String

おそらく最も簡単で最も読みやすい。

    String value = "some data", key = "0101101010101010101011010110101010010101";
    HashMap<String, String> map = new java.util.HashMap<String, String>();
    map.put(key, value);

追加:タイプのキーを変換します byte[]String, 、使用できます BigInteger クラス、例:

    byte[] keyb = { 90, -86, -83, 106, -107 };
    String keys = new BigInteger(keyb).toString(2);

エレメント keys 値があります: 101101010101010101011010110101010010101.

key なので byte[]

個人的にはこれを避けたいと思います。この場合の単純なデフォルトのハッシュ関数は、キーとして配列を参照しますが、深いハッシュが必要です(すべての要素は等しくなければなりません)。以下は説明されているように機能しません:

    HashMap<byte[], String> map = new HashMap<byte[], String>();
    map.put(new BigInteger(key1, 2).toByteArray(), value);

1つの方法 fix これは、アレイをクラスに配置するか、呼ばれるコレクションを拡張することです ArrayList 等しい方法とハッシュメソッドを書き直します。それは見た目ほど些細なことではありません - あなたは本当に自分が何をしているのかを知る必要があります。

key なので BitSet

ビットの抽出、追加、操作は最も効率的ではありません - かなり遅いです。したがって、これはメモリサイズに非常に顕著に影響を与える場合にのみ良いオプションのように思えますが、それは問題です。

    String value = "some data", key = "0101101010101010101011010110101010010101";
    HashMap<BitSet, String> map = new HashMap<BitSet, String>();
    map.put(getBitSet(key), value);

仮設を作成できます BitSet 次のようなクラスコンバーター:

public static int keySize = 41;
public static BitSet getBitSet(String key) {
    char[] cs = new StringBuilder(key).reverse().toString().toCharArray();
    BitSet result = new BitSet(keySize);
    int m = Math.min(keySize, cs.length);

    for (int i = 0; i < m; i++)
        if (cs[i] == '1') result.set(i);

    return result;
}
public static String getBitSet(BitSet key) {
    StringBuilder sb = new StringBuilder();
    int m = Math.min(keySize, key.size());

    for (int i = 0; i < m; i++)
        sb.append(key.get(i) ? '1' : '0');

    return sb.reverse().toString();
}

他のヒント

この値をバイト配列に変換する必要がありますか?

バイト配列は1つのオプションです。その他には、短い、intまたはlong、または(おそらく)インスタンスの配列が含まれます。 Bitset クラス。どちらが最適かは、「レコード」オブジェクトの作成方法と、アプリケーションがどのように処理するかに依存します。

表現タイプを決定したら、値が単純であるため、レコードのあるハッシュテーブルを作成します。例えば

HashMap<SomeKey, Record> map = new HashMap<SomeKey, Record>();
map.put(someKey, record); 
...

または、直接データをメモリに保存できますか?

Javaではできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top