Наиболее эффективный способ хранения большого шестнадцатеричного числа (md5) в объекте Java - PullRequest
3 голосов
/ 30 июня 2011

Какой будет самый эффективный способ (оптимальный по производительности и объему памяти) для хранения суммы MD5 файла в java (или groovy) объекте с учетом следующих вариантов использования:

  1. Мне нужно сравнить с тысячами других md5 сумм.
  2. Мне может понадобиться сохранить это в HSQLDB, чтобы можно было извлекать записи / group by на основе md5
  3. Может храниться в Map как ключи

Я стараюсь не сохранять его как String, поскольку сравнение строк будет более затратным и займет больше места. Будет ли BigInteger(string,radix) более эффективным? Кроме того, какой тип данных следует выбрать, если он сохраняется в базе данных?

Ответы [ 3 ]

4 голосов
/ 30 июня 2011

Создайте класс, который упаковывает byte[] и не содержит мутаций.Если вы хотите использовать его в качестве ключа на карте, он должен быть сопоставимым или иметь хеш-код.С byte[] вам будет проще вычислить простой хеш-код из первых 32 бит.

1 голос
/ 30 июня 2011

Для сравнения скорости в Java, сохранение ее в виде двух значений long, вероятно, будет самым быстрым.Для персистентности хранение в виде байтового массива имеет смысл, если ваша база данных и инструменты персистентности поддерживают его.В противном случае хранение в виде шестнадцатеричного или кодированного в Base-64 текста является довольно распространенным явлением и будет хорошо взаимодействовать с другими приложениями, которые обращаются к той же базе данных.

0 голосов
/ 30 июня 2011

Если вам нужно выполнить много сравнений, вы можете сохранить значение MD5 в виде 2 long целых чисел, таким образом вам нужно всего лишь выполнить не более 4 логических операций для проверки другого значения MD5.

В основном, предоставьте класс, который будет принимать входные данные, необработанные сводные данные как byte[] и использовать

ByteBuffer bb = ByteBuffer.wrap(digestData);
long[] bits = new long[] {
    bb.getLong(),
    bb.getLong()
};

Сравните с другим long[] массивом MD5 с

boolean eq = ((bits[0]^otherBits[0]) | (bits[1]^otherBits[1])) == 0);

РеконструкцияMD5 с

ByteBuffer bb = ByteBuffer.allocate(16);
bb.putLong(bits[0]);
bb.putLong(bits[1]);

byte[] digestData = new byte[16];
bb.get(digestData);

Примечание : я не предлагаю преобразовывать byte[] в long[] для каждого сравнения, это просто, как хранить дайджест для сравнений.Последний фрагмент реконструкции является необязательным, вы должны хранить данные как byte[] и сравнивать только long[] массивы.В базе данных сохраните данные как шестнадцатеричное 32-байтовое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...