LINUX.ORG.RU

Проверка целостности файла

 , , , ,


0

2

Есть игра для Android, которая разделена на две части - apk (сама игра) и obb (ресурсы, которые лежат на сервере гугеля).

Игра при старте должна проверить наличие и целостность obb (в моем случае это обычный zip). Если файла нет или он поврежден, то игра должна его скачать с сервера заново.

Вопрос, как проверить целостность архива? Проверять crc каждого файла в архиве - пользователь скажет «вот говно», и удалит игру. И будет совершенно прав.

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

Была идея дописывать размер файла в конец архива, а при старте игры сверять текущий размер с размером, приписанным в конце.
Но как на это посмотрит zlib? Правильное ли это решение?

Буду рад любой идее или совету.

★★★★★

Ответ на: комментарий от andreyu

Тоже думал об этом и в топике спросил, правильно ли так делать?

Проверить, пережует ли это zlib можно, но не огребу ли я грабли в дальнейшем?

ЕМНИП в zip и так есть CRC32. Т.ч. зачем велосипед изобретать?

drBatty ★★
()
Ответ на: комментарий от andreyu

А его наличие поможет как то решить проблему озвученную в этом топике?

да. Если файл изменён, значит он не тот. Очевидно же! А один раз можно и проверить ЭЦП, это не долго, по сравнению с закачкой.

А вот с битыми файлами должна система заниматься, а не твоя программа. Кроме как CRC32 тут ничего не получится сделать. Да и CRC32 тоже не панацея (может и сама программа убиться).

drBatty ★★
()
Ответ на: комментарий от andreyu

Просто дописать в конец файла пару байт можно без проблем?

Для unzip это не проблема.

Если так, то это подходящее решение.

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

tailgunner ★★★★★
()
Ответ на: комментарий от andreyu

Хеши считать на обычном компе.

А файл с хешем на вебсервер, и пущай при старте прога качает его. И ложит куда ей надо на девайсе.

pztrn ★★★★
()
Ответ на: комментарий от drBatty

ЕМНИП в zip и так есть CRC32. Т.ч. зачем велосипед изобретать?

Очевидно для того, что бы до старта игры убедиться, что ресурсы целые.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от drBatty

да. Если файл изменён, значит он не тот. Очевидно же! А один раз можно и проверить ЭЦП, это не долго, по сравнению с закачкой.

Читайте по губам - ФС может глюкануть. Это для вас не очевидно?

А вот с битыми файлами должна система заниматься, а не твоя программа. Кроме как CRC32 тут ничего не получится сделать. Да и CRC32 тоже не панацея (может и сама программа убиться).

Почти вся ветка в этом топике решает совсем не ту задачу. Упуская важные для пользователя ньюансы, аля скорость.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Для unzip это не проблема.

Ну и супер, значит так и поступлю.

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

За исключением нескольких байт, приписанных мною вконце.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от pztrn

А файл с хешем на вебсервер, и пущай при старте прога качает его. И ложит куда ей надо на девайсе.

Хеш нужно на стационаре посчитать и сделать его эталонным. Этот же хеш нужно считать и на мобильном девайсе, сравнивая его с эталонным.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Пара секунд - это «давай досвидания, тормозная игра».

Вот уж не знаю... Буквально на днях стянул какой-то слешер. Он на Galaxy Tab 2 грузится больше минуты, и ничего, в топе маркета держится.

solovey ★★
()
Ответ на: комментарий от solovey

Вот уж не знаю... Буквально на днях стянул какой-то слешер. Он на Galaxy Tab 2 грузится больше минуты, и ничего, в топе маркета держится.

The Croods тоже вверху, хотя средняя оценка стремится к 3. Имена DreamWorks и Rovio делают свое дело.

А ну да, реклама рулит. Кто то может не более 1000 баксов в сутки тратить, а кто то несколько десятков тысяч в сутки тратит и не дергается.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Очевидно для того, что бы до старта игры убедиться, что ресурсы целые.

всё равно распаковывать надо. Вот и узнаешь. За то бесплатно.

drBatty ★★
()
Ответ на: комментарий от andreyu

Читайте по губам - ФС может глюкануть. Это для вас не очевидно?

нет. Программа не должна этим заниматься. Это не её проблемы. Ты тоже можешь описаться, и что? Программа должна тебе предложить купить памперс с доставкой?

Почти вся ветка в этом топике решает совсем не ту задачу. Упуская важные для пользователя ньюансы, аля скорость.

обычно скорость вычисления CRC32 намного выше скорости чтения файла. И в большинстве платформ имеются нативные библиотеки для этого.

drBatty ★★
()
Ответ на: комментарий от drBatty

всё равно распаковывать надо. Вот и узнаешь. За то бесплатно.

Только тогда, когда ресурс нужен. А музыка и вовсе стримится из архива без распаковки.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от drBatty

нет. Программа не должна этим заниматься. Это не её проблемы. Ты тоже можешь описаться, и что? Программа должна тебе предложить купить памперс с доставкой?

Снова судите о других по себе?

обычно скорость вычисления CRC32 намного выше скорости чтения файла. И в большинстве платформ имеются нативные библиотеки для этого.

Это как то помогает избавиться от тормозов при чтении файла для расчета crc?

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Хеш нужно на стационаре посчитать и сделать его эталонным. Этот же хеш нужно считать и на мобильном девайсе, сравнивая его с эталонным.

А в чем проблема то?

pztrn ★★★★
()
Ответ на: комментарий от andreyu

нет. Программа не должна этим заниматься. Это не её проблемы. Ты тоже можешь описаться, и что? Программа должна тебе предложить купить памперс с доставкой?

Снова судите о других по себе?

слушай, делай как знаешь. Если честно, я не помню, как этот вывод грамотные люди аргументируют. Для меня это очевидный факт - программа не должна проверять глюки ФС/ОС.

Это как то помогает избавиться от тормозов при чтении файла для расчета crc?

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

И да, хардкорить ничего не нужно. Лучше в файле. Отдельно или вместе. И лучше CRC32 - это дёшево, и достаточно надёжно (хоть и сломать можно).

drBatty ★★
()
Ответ на: комментарий от andreyu

А ну да, реклама рулит.

Безусловно, но мне кажется, что если игра стоящая, пользователю будет не в лом подождать лишние 5 секунд.

Впрочем, это уже оффтоп...

solovey ★★
()
Ответ на: комментарий от andreyu

1. Создаю файл с ресурсами.
2. Считаю его md5.
3. Добваляю в файл с ресурсами md5.
4. Теперь у меня файл с ресурсами и md5, который уже невалиден.

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

zolden ★★★★★
()
Ответ на: комментарий от andreyu

1. Создаю файл с ресурсами.
2. Считаю его md5.
3. Добваляю в файл с ресурсами md5.
4. Теперь у меня файл с ресурсами и md5, который уже невалиден.

Я правильно понял вас?

добавляем пару пунктов
5. Извлекаем md5
6. Считаем md5 файла ресурсов
7. Сраниваем извлеченный и посчитанный md5
8. Видим что валиден

anonymous
()
Ответ на: комментарий от drBatty

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

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

И да, хардкорить ничего не нужно. Лучше в файле. Отдельно или вместе. И лучше CRC32 - это дёшево, и достаточно надёжно (хоть и сломать можно).

Ну почитайте еще раз топик. Вы ходите по кругу, говорите одно и тоже, но не читаете, что говорят вам.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от solovey

Впрочем, это уже оффтоп...

Да.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от zolden

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

Слышал звон, не знаю, где он.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от anonymous

добавляем пару пунктов
5. Извлекаем md5
6. Считаем md5 файла ресурсов
7. Сраниваем извлеченный и посчитанный md5
8. Видим что валиден

Вы вообще понимаете, что тут написали?
Верните уже умного анонимуса.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

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

ссылку можно? на ваши проблемы. Я их видимо как-то не так понимаю.

но не читаете, что говорят вам.

я читаю. что мне говорят. Что я ещё должен читать? Вот это:

The Croods тоже вверху, хотя средняя оценка стремится к 3. Имена DreamWorks и Rovio делают свое дело.

хорошо, буду знать. А в чём вопрос-то?

drBatty ★★
()
Ответ на: комментарий от andreyu

школьник прекращай писать игры иди уроки учить, тебе уже вариантов накидали уйму
Если головушка не варит, то на - https://dl.dropbox.com/u/3314382/Текстовый документ (3).zip
считай последине 32 байта, удали их из файла. посчитай md5 получившегося архива, сравни с тем что считал. Архив остается рабочим даже с записанными в конец 32мя байтами.

anonymous
()
Ответ на: комментарий от drBatty

хорошо, буду знать. А в чём вопрос-то?

Вопрос прост, что вы делаете в этом топике?

andreyu ★★★★★
() автор топика
Ответ на: комментарий от anonymous

школьник прекращай писать игры иди уроки учить, тебе уже вариантов накидали уйму

Тут только tailgunner подтвердил мое предположение. Вы же пишете муть. Сами то уроки уже сделали?

считай последине 32 байта, удали их из файла. посчитай md5 получившегося архива, сравни с тем что считал. Архив остается рабочим даже с записанными в конец 32мя байтами.

Хочу умного анонимуса, который умеет читать, а не только писать.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от zolden

http://stackoverflow.com/questions/1118028/file-containing-its-own-checksum

Тут речь о другом. Подобное решение уже обсудили. Речь шла о том, как это реализовать вот в этом случае: Проверка целостности файла (комментарий)

andreyu ★★★★★
() автор топика
Последнее исправление: andreyu (всего исправлений: 1)

Спасибо всем участникам дискуссии. Решение найдено и будет использовано.

andreyu ★★★★★
() автор топика

Внутри твоего архива minizip(в андроиде он вроде) сам будет все проверять...

Просто проверить есть ли файл и «правильный» ли он так:

  • при создании(публикации) файла ресурсов дописать ему 4 байта в конец
  • после скачивания эти 4 байта откусить от него и сохранить в настройки(ну или хз куда там можно /data/data/com.app....). Еще(на всякий случай) сохраняешь туда же время создания|модификации файла ресурсов.

Все. Этими данными можно пользоваться для проверки.

если нужна 1000% надежность - MD5|SHA{1|256|512} и перелопачивание файла каждый раз при старте, а это ой как тоооормозно

TOXA ★★
()

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

Я просто несколько дней назад стал владельцем андроида. Изучаю вопрос. Мне бы точно не понравилось, если бы программа занизила свой реальный размер. Правда, о таких вещах обычно пишут в описании. Вон, Google Translate честно сообщает, что словари нужно будет загрузить для оффлайновой работы.

dave ★★★★★
()
Ответ на: комментарий от TOXA

Просто проверить есть ли файл и «правильный» ли он так:

Угу, спасибо, так и решил делать.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от dave

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

1. Есть много девайсов, на которых внутренней памяти не так и много. К примеру на htc desire не удается установить (точнее даже скачать) angry birds, т.к. apk не умещается в кеш.

2. Ресурсы обновляются реже, чем сама игра. Это не принципиально, когда у пользователя дешевый траффик или вообще анлим. Но не у всех оно так.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Спасибо за ответ! Просто мне стало ужасно интересно все, связанное с андроидом. Пока только обучаюсь :)

dave ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.