Нужны идеи для алгоритма сжатия - PullRequest
3 голосов
/ 05 декабря 2010

Справочная информация: Я создаю веб-систему создания аватаров, в которой пользователь может выбирать части для своего аватара (например, тело, фон, глаза, рот, куртка, брюки и т. Д.) И затем из этих выборов генерируется изображение. Из соображений производительности я собираюсь сделать следующее: из списка выбранных элементов сгенерировать имя файла, содержащее их идентификаторы, и сохранить изображение под этим именем. Затем, когда приходит запрос на изображение, веб-сервер будет обслуживать его напрямую. Если изображение не найдено, обработчик 404 сгенерирует его. И вот тогда возникает проблема:

Вопрос: Я бы хотел сжать список целых чисел как можно более короткой строкой, состоящей только из символов ASCII (можно использовать для имен файлов и URL-адресов). Целые числа будут уникальными и больше 0 (0 не будет среди них). Я ожидаю, что их может быть около 20, и они не будут превышать 200, но это только предположение (хотя я был бы удивлен, если бы они прошли за 500). Порядок не важен.

Что вы посоветуете мне сделать?

Обновление: Упс, кажется, я сделал фундаментальную ошибку. Я хотел избежать хранения каждого сгенерированного аватара в БД, а не хранить всю необходимую информацию в имени файла. Таким образом, я надеялся избежать ненужного использования БД и, таким образом, повысить производительность. Однако сегодня меня поразило, что люди могут захотеть изменить своих аватаров и ожидать, что они будут обновляться везде, где они использовались. Таким образом, имя файла должно быть постоянным. Тогда остается только один вариант - мне нужно сохранить информацию об аватаре в БД. И тогда я мог бы также использовать GUID или некоторые другие случайные строки для имен файлов.

Спасибо всем за помощь, и извините за ложную тревогу. (

Ответы [ 3 ]

1 голос
/ 05 декабря 2010

Объединить целые числа (9 бит на элемент) в массив байтов, а затем закодировать результат в Base64 .

0 голосов
/ 05 декабря 2010

Одним из вариантов может быть использование md5 комбинации чисел для получения 128-битного числа.Затем вы можете закодировать его в шестнадцатеричную строку ASCII или в кодировку base64 в 22-символьную строку.

Теперь вы можете гарантировать, что все имена файлов имеют фиксированный размер и существует только очень маленькийвероятность столкновения.

Это экономит небольшой объем пространства для каждого имени файла (128 бит вместо 180) и не зависит от количества значений и диапазона каждого значения, поэтому даже если вы выходите за пределы 20элементы или максимальное значение 500, это не повлияет на длину имени файла.

0 голосов
/ 05 декабря 2010

Не совсем понятно, что вы ищете; будет работать ASCII-85? http://en.wikipedia.org/wiki/Ascii85

Как и в случае, каждое целое число кодируется в символ UTF-8, символы превращаются в строку, а затем кодируются результирующей строкой в ​​base-85.

Как отмечает Даг Керри, ASCII-85 не является хорошим выбором. Любой из вариантов base64, которые не используют косую черту, является предпочтительным.

...