gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:15:52 24 4
gpt4 key购买 nike

我正在制作游戏,它很可能是用 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 加密器 - 您需要自己动手...
  • 这只会给你 16 个数字 - 如果你使用另一个数字,则为 128 个。您如何将数字“四舍五入”到您需要的范围?
    • 我实际上考虑过这一点。将数字除以潜力(16 或 128...),然后将其乘以所需的随机范围。只要范围保持不变,结果也将保持不变……但这也是一个约束……

考虑到这些缺点,有没有更好的方法,既简单又不需要整个框架?在我的例子中,我真正需要的只是一个 MD5 加密函数,我的实现基本完成了。

欢迎任何建议。我想“选择的答案”将是我提到的所有内容中最有用或最实用的建议或方法。

最佳答案

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

1) 您不需要 MD5 哈希。实际上,由于在您的情况下对散列的统计质量没有兴趣,因此几乎任何散列函数都会令人满意。您可以使用任何评估成本更低的字符串哈希算法。如果你只接受 ASCII characters , 然后是 Pearson hash也是一种选择 - 它快速、简单且易于移植到任何语言。

2) 您真的需要用户提供字符串种子,还是可以接受单个整数种子?如果可以接受,那么您可以使用 integer hash function ,这比字符串哈希算法快得多,也非常简单且易于移植。

3) 任何像样的伪随机数生成器 (PRNG) 都会为您提供具有不同种子值的完全不同的序列。这意味着随着级别的增加,您可以简单地将种子增加 1 作为 ++seed 并由此生成随机数。我建议使用自定义的简单快速的随机数生成器,而不是 JavaScript 的 Math.random()。您可以使用 xorshift 的一些变体.

通过这 3 点,您列出的所有缺点都得到了解决,并且不需要框架。

我不担心黑客攻击。正如@apokryfos 在评论中指出的那样,即使是您使用 MD5 is not secure 的原始解决方案,而且我认为游戏中的关卡生成并不是需要密码学的最佳示例。想想看,即使是大型商业游戏也是可以破解的。

关于javascript - 用于种子随机数生成的 MD5,更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44468875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com