Как создать хэш-карту, которая будет содержать 528-битную запись в двоичном формате - PullRequest
0 голосов
/ 20 марта 2011

Мне нужно создать хэш-карту, которая будет содержать 528-битные двоичные данные.Как бинарные данные будут храниться в хэш-карте?

Пример: 0000000001000000100000000 ... это 25 бит.Точно так же мне нужно хранить 528 битов.

Нужно ли преобразовывать это значение в некоторый байтовый массив или я могу напрямую хранить данные в памяти?

Пример может быть очень полезен.

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

Нужно ли преобразовывать это значение в какой-нибудь байтовый массив?

Массив байтов является одним из вариантов. Другие включают массивы short, int или long или (возможно) экземпляры класса Bitset. Какой из них лучше, зависит от того, как создаются «записи» объектов и как ваше приложение обрабатывает их.

Как только вы определились с типом представления, создать хеш-таблицу с записью в качестве значений просто; например, * +1008 *

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

или напрямую я могу хранить данные в памяти?

Вы не можете сделать это в Java.

1 голос
/ 20 марта 2011

Не усложняйте свою жизнь.

Предполагая, что value имеет тип 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);

Один из способов fix - это поместить массив в класс или расширить коллекцию с именем ArrayList и переписать метод equals и hash. Это не так тривиально, как кажется - вам действительно нужно знать, что вы делаете.

Хранить 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...