Я делаю игру, она, скорее всего, будет построена на JavaScript - но этот вопрос скорее не агностик...
Игра включает в себя создание случайной кампании, однако, чтобы отговорить взломать и уменьшить объем пространства для хранения, необходимого для сохранения игры (что потенциально может быть облачным), я хотел, чтобы генерация кампании была основана на семенах.
Пытаясь подумать о способах достижения этого, я рассмотрел подход на основе MD5. Например, скажем, в начале игры пользователю предоставляется случайное семя "ABC123". Когда вы выбираете, какой шаблон уровня использовать для каждого уровня игры, я мог бы генерировать хеши MD5...
MD5("ABC123" + "level1"); // = 3f19bf4df62494495a3f23bedeb82cce
MD5("ABC123" + "level2"); // = b499e3184b3c23d3478da9783089cc5b
MD5("ABC123" + "level3"); // = cf240d23885e6bd0228677f1f3e1e857
В идеале есть только 16 шаблонов. Будет больше, но для демонстрации, если бы я взял первую букву из каждого хеша, у меня есть случайное число из 16, которое я мог бы повторно произвести с тем же самым семенем навсегда.
Уровень 1 для этого семени всегда "3" (# 3), уровень 2 всегда "b" (# 11), уровень 3 всегда "c" (# 12)
У этого подхода есть несколько недостатков, я уверен, что многие будут быстро указать...
Учитывая эти недостатки, существует ли более простой подход, не требующий полной структуры? В моем случае все, что мне действительно нужно, это функция шифрования MD5, и моя реализация в основном завершена.
Любые советы приветствуются. Я думаю, что "выбранный ответ" - это предложения или подход, который является самым полезным или практичным, учитывая все, что я упомянул.
Я думаю, вы слишком усложняете решение.
1) Вам не нужен хэш MD5. Фактически, поскольку в вашем случае нет интереса к статистическому качеству хэша, почти любая хэш-функция будет удовлетворительной. Вы можете использовать любой хэш-алгоритм, который дешевле оценить. Если вы принимаете только символы ASCII, то хеш Pearson также является опцией - он быстрый, простой и удобный для переноса на любой язык.
2) Действительно ли вам нужны строковые семена от пользователя, или одно целое семя также приемлемо? Если это приемлемо, вы можете использовать целочисленную хеш-функцию, которая значительно быстрее, чем алгоритм хеширования строк, также очень простой и удобный для подключения.
3) Любой достойный генератор псевдослучайных чисел (PRNG) даст вам радикально различную последовательность с каждым разным начальным значением. Это означает, что с увеличением уровней вы можете просто увеличить семя на 1
как ++seed
и генерировать случайные числа. Я рекомендую использовать простой и быстрый генератор случайных чисел, отличный от JavaScript Math.random()
. Вы можете использовать некоторый вариант xorshift.
С этими 3 пунктами все перечисленные недостатки адресованы, и никакой рамки не требуется.
Я бы не стал беспокоиться о взломе. Как заметил @apokryfos в комментариях, даже ваше оригинальное решение с MD5 небезопасно, и я думаю, что создание уровней в играх - не лучший пример, где вам нужна криптография. Подумайте, даже крупные коммерческие игры с заголовком можно взломать.