MD5 для генерации случайных чисел, лучшие подходы?

1

Я делаю игру, она, скорее всего, будет построена на 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 имеет интенсивность процессора, особенно если используется в цикле и т.д....
  • JavaScript не поставляется с шифром MD5 - вам нужно сделать DIY...
  • Это дает вам только 16 номеров - или 128, если вы используете другой номер. Как вы "округлите" число до требуемого диапазона?
    • Я это считал. Разделите число на потенциал (16 или 128...), затем умножьте его на требуемый случайный диапазон. Пока диапазон остается тем же, так и результат... но это тоже ограничение...

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

Любые советы приветствуются. Я думаю, что "выбранный ответ" - это предложения или подход, который является самым полезным или практичным, учитывая все, что я упомянул.

Теги:
hash
hashcode
random
md5

1 ответ

2
Лучший ответ

Я думаю, вы слишком усложняете решение.

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

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

3) Любой достойный генератор псевдослучайных чисел (PRNG) даст вам радикально различную последовательность с каждым разным начальным значением. Это означает, что с увеличением уровней вы можете просто увеличить семя на 1 как ++seed и генерировать случайные числа. Я рекомендую использовать простой и быстрый генератор случайных чисел, отличный от JavaScript Math.random(). Вы можете использовать некоторый вариант xorshift.

С этими 3 пунктами все перечисленные недостатки адресованы, и никакой рамки не требуется.

Я бы не стал беспокоиться о взломе. Как заметил @apokryfos в комментариях, даже ваше оригинальное решение с MD5 небезопасно, и я думаю, что создание уровней в играх - не лучший пример, где вам нужна криптография. Подумайте, даже крупные коммерческие игры с заголовком можно взломать.

  • 0
    Вау @plasmacel, удивительно глубокий ответ! По сравнению с некоторыми из этих альтернатив использование MD5 было бы до смешного неэффективным. Вы правы, целочисленная хеш-функция будет более чем достаточной для моих целей. Даже базовая реализация xorshift может сработать - обидно, что в качестве начального ввода нужно всего 4 целых числа ... но я все еще могу заставить это работать. Еще раз спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню