Насколько эффективен алгоритм кодирования/декодирования класса Base64 в Java?

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

Вопрос

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

Позже, когда я получаю второй файл, мне нужно взять кодированные данные из базы данных (ранее хранящихся), а затем расшифровать его и проверить новыми данными для дубликата.

Я старался org.apache.commons.codec.binary.Base64 класс у него есть 2 метода:

  1. encodeBase64(Byte[] barray)
  2. decodeBase64(String str)

который работает отлично нормально и решает мою проблему. Но он преобразует 55 char string только в 6 строк.

Поэтому мне интересно, есть ли какой -либо случай, когда этот алгоритм кодирует 2 строки, которые очень большие и имеют только 1 несоответствие (например) только в одинаковых кодированных байтовых массивах.

Я знаю о Base64 Класс много, но если кто -то может помочь мне, это будет действительно полезно.

Если вы можете предложить какой -либо другой алгоритм, который делает большую строку не хватает фиксированной длины, и решает мою цель, я буду рад его использовать.

Заранее спасибо.

Это было полезно?

Решение

Не очень эффективно.

Также использование sun.misc Классы дают невозможности применения.

Проверьте следующие сравнения производительности из Migbase64:

enter image description here


Поэтому мне интересно, есть ли какой -либо случай, когда этот алгоритм кодирует 2 строки, которые очень большие и имеют только 1 несоответствие (например) только в одинаковых кодированных байтовых массивах.

Base64 не является алгоритмом хэширования, это кодирование и, следовательно, должно быть двунаправленным. Столкновения не могут быть разрешены по необходимости - в противном случае декодирование будет не определенным. Base64 предназначен для представления произвольных двоичных данных в строке ASCII. Кодирование строки Unicode, как Base64 часто будет увеличивать количество Кодовые точки Требуется, поскольку набор символов Unicode требует нескольких байтов. Представление Base64 строки Unicode будет варьироваться в зависимости от используемого кодирования (UTF-8, UTF-16). Например:

Base64( UTF8( "test" ) ) => "dGVzdA=="
Base64( UTF16( "test" ) ) => "/v8AdABlAHMAdA=="

Решение 1

Используйте сжатие без потерь

GZip( UTF8( "test" ) )

Здесь вы преобразуете строку в массив байтов и используете сжатие без потерь, чтобы уменьшить количество байтов, которые вы должны хранить. Вы можете изменить алгоритм кодирования и сжатия ChAR, чтобы уменьшить количество байтов в зависимости от строк, которые вы будете хранить (то есть, если это в основном ASCII, то UTF-8, вероятно, будет лучшим.

Плюс: Без столкновений, способность восстанавливать исходную строку
Минусы: Байты, необходимые для хранения, являются переменными; Байты, необходимые для хранения

Решение 2

Используйте алгоритм хеширования

SHA256( UTF8( "test" ) )

Здесь вы преобразуете строку в набор с фиксированной длиной байтов с функцией хэширования. Хешинг-однонаправленное и по своей природе Столкновения могут быть возможны. Анкет Однако, основываясь на профиле и количестве строк, которые вы ожидаете обработать, вы можете выбрать функцию хэш, чтобы минимизировать вероятность столкновений

Плюс: Байты, необходимые для хранения, фиксируются; Байты, необходимые для хранения, невелики
Минусы: Столкновения возможны, нет возможности восстановить исходную строку

Другие советы

Я только что видел ваш комментарий - кажется, что вы на самом деле ищете сжатие, а не хеширование, как я изначально думал. Хотя в этом случае вы не будет иметь возможность получить вывод фиксированной длины для произвольного ввода (подумайте об этом, бесконечное количество входов не может сопоставить биологическую карту с конечным количеством выходов), поэтому я надеюсь, что это не было сильным требованием.

В любом случае, производительность выбранного вами алгоритма сжатия будет зависеть от характеристик входного текста. При отсутствии дополнительной информации дефлятное сжатие (как используется входными потоками ZIP, IIRC) является хорошим алгоритмом общего назначения для начала, и, по крайней мере, использование в качестве основы для сравнения. Для простоты реализации вы можете использовать Дефлятор Класс, встроенный в JDK, который использует сжатие Zlib.

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

Эти другие вопросы могут представлять интерес:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top