Существуют ли общие методы для хеширования входного файла с фиксированным набором значений? - PullRequest
2 голосов
/ 26 декабря 2009

Допустим, я пытаюсь сгенерировать монстра для использования в ролевой игре из произвольной части входных данных. Вспомните Barcode Battler или более новую игру для iPod, имя которой ускользает от меня.

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

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

Этот вопрос не связан с конкретным языком, но я работаю в C #, так что это было бы моим предпочтением для обсуждения. Спасибо!

Ответы [ 3 ]

4 голосов
/ 26 декабря 2009

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

monsterId = hashResult % 100;

Обратите внимание, что если позже вы решите добавить нового монстра и изменить код на % 101, почти все хэши внезапно отобразятся на разных монстров.

2 голосов
/ 28 декабря 2009

Хорошо, это очень хороший вопрос. Я бы сказал: не используйте хэш, потому что это не будет хорошим способом предсказать паттерны для игрока. Из теории познания мы знаем, что в играх интересно то, что игрок может учиться методом проб и ошибок. Так что, если игрок вводит изображение красного дракона и другое изображение красного дракона с немного отличающимися пикселями, он хотел бы, чтобы появилось то же самое чудовище, верно? Если вы используете хеши, это не так.

Вместо этого я бы порекомендовал делать намного более простые вещи. Представьте, что ваш необработанный фрагмент ввода - это просто byte[], он уже представляет собой список чисел. К сожалению, это всего лишь список чисел от 0 до 255, поэтому, если вы, например, сделаете среднее значение, вы можете получить 1 число от 0 до 255. Чтобы вы могли отображать количество монстров уже, если вам нужно больше, вы можете прочитать пары байтов и просто составить Int16, таким образом вы сможете использовать до 65536 возможных монстров:)

0 голосов
/ 26 декабря 2009

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

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

Посмотрите в пространстве имен System.Security для провайдера MD5Crypto пример того, как сгенерировать MD5 из последовательности байтов.

Редактировать: Если вы хотите убедиться, что хеш сталкивается в относительно коротком порядке, вы можете использовать CRC2, 4, 6, 8, 16, 32, которые будут довольно часто (особенно CRC2 :)), но будут такими же тот же файл. Легко генерировать.

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