MD5用于种子随机数生成,更好的方法?

时间:2017-06-10 02:12:43

标签: javascript random hash md5 hashcode

我正在制作游戏,它很可能是用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生成是CPU密集型的,特别是如果在循环等中使用...
  • JavaScript并没有配备MD5加密器 - 您需要DIY ...
  • 只提供16个数字 - 如果您使用其他数字,则为128。你如何围绕'数量到你要求的范围?
    • 我实际上考虑过这个。将数字除以电位(16或128 ......),然后乘以所需的随机范围。只要范围保持不变,结果也是如此......但这也是一个约束......

鉴于这些缺点,是否有一种更简单的方法,不需要整个框架?在我的情况下,我真正需要的是一个MD5加密器功能,我的实现基本上完成。

任何建议表示赞赏。我猜选择答案"鉴于我所提到的一切,将是最有用或最实用的建议或方法。

1 个答案:

答案 0 :(得分:2)

我认为你使解决方案过于复杂。

1)您不需要MD5哈希。实际上,因为在你的情况下,对哈希的统计质量没有兴趣,几乎任何哈希函数都是令人满意的。您可以使用任何更便宜的字符串哈希算法进行评估。如果您只接受ASCII characters,则Pearson hash也是一个选项 - 它快速,简单且易于移植到任何语言。

2)你真的需要来自用户的字符串种子,还是一个整数种子也可以接受?如果可以接受,那么你可以使用integer hash function,它比字符串哈希算法快得多,也非常简单易用。

3)任何体面的伪随机数生成器(PRNG)都会为每个不同的种子值提供截然不同的序列。这意味着随着级别的增加,您可以简单地将种子增加1作为++seed并生成随机数。我建议使用除JavaScript Math.random()之外的自定义简单快速随机数生成器。您可以使用xorshift的某些变体。

通过这3点,所有列出的缺点都得到了解决,无需框架。

我不担心黑客行为。正如@apokryfos在评论中指出的甚至是MD5 is not secure的原始解决方案,我认为游戏中的级别生成并不是您需要加密的最佳示例。想一想,即使是大牌商业游戏也是可以攻击的。