【问题标题】:Generate same Random BigInteger in Java for android在Java中为android生成相同的随机BigInteger
【发布时间】:2016-04-19 12:57:56
【问题描述】:

我正在尝试在 Java 中生成一个随机的 BigInteger,但是当使用相同的种子作为安全随机数时,我需要生成相同的值:

BigInteger P = new BigInteger(1024,1,new SecureRandom(SEED));

奇怪的是,即使SEED的值相同,上面这行代码也会生成不同的值,这是怎么回事?

【问题讨论】:

  • '随机' - '必须相同' ...
  • 有关 SecureRandom 工作原理的一些信息,请查看stackoverflow.com/questions/11051205/…的另一个问题
  • @Stultuske 这并不像听起来那么奇怪,如果提供相同的种子,有很多用例不需要另一个随机序列。显然也有实际需要相同序列的用例,即使序列本身由(伪)随机数组成。
  • @SebastiaanvandenBroek 我并不是说这很奇怪,我只是指出只要有“规则”,这个数字就不再是随机的了。
  • @Stultuske 我认为这里要区分的是,该序列中的数字对于该特定序列/在该特定序列内仍然是随机的,这就是 OP 需要的那种随机性。序列本身将是相同的似乎是期望的行为。

标签: java android random biginteger


【解决方案1】:

如果您希望随机性具有确定性,请不要使用SecureRandom。它的重点是提供比常规Random 更好、更安全的随机源,它为您提供具有确定性算法的伪随机值,允许(并强制)您始终使用相同的种子获得相同的值。

SecureRandom 的不同之处在于它不依赖于单一算法,而是使用SPI 机制来允许实现从各种不同来源生成随机性。

【讨论】:

  • 由于实现问题,我需要使用 SecureRandom,我将 SecureRandom 子类化并覆盖 getBytes 方法,但以未生成相同 BigInteger 值的相同结果结束
  • 为什么?您的代码 sn-p 不依赖于SecureRandom。事实上,您刚刚解释了它不起作用因为 SecureRandom
  • 不正确我将 SecureRandom 替换为如下: BigInteger P = new BigInteger(1024,1,new Random(SEED));但它仍在生成不同的数字,似乎是 BigInteger 类中的东西
  • @ammcom 我无法重现这一点。给定相同的种子(在我的情况下为 1024),当使用常规 Random 时,我得到 2 个相等的 BigIntegers。我在 Linux 上使用 Oracle Java 8。啊,这是一个特定于 android 的问题。
【解决方案2】:

其实我想通了,我正在开发一个 Android 应用程序,Android 中 BigInteger 类的实现似乎有所不同,在 Android 中,文档说如果位长大于 16,构造函数将忽略指定的 Random 对象并将使用 OpenSSL BN_generate_prime_ex 作为随机数的来源 编辑: 因为有人可能会使用它,所以我实现了一个新的大整数类,它与 java SE 版本具有相同的代码,并发现这是一个性能问题,使得 android Sdk 创建者改变了这个类的实现由于我的课程运行速度非常慢以至于它不适用于实际应用程序,我们应该找到一些 C++ 实现并使用 NDK

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2017-07-30
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多