【问题标题】:Reduce Java BigInteger to fixed length smaller number将 Java BigInteger 减少到固定长度的较小数字
【发布时间】:2012-02-23 12:36:40
【问题描述】:

我正在尝试实现一个随机数生成器系统;本质上,我正在读取 SHA1 哈希,然后将其转换为 BigInteger 值:

String start = "abc";
String hash = utils.SHA1(start); //Generates an SHA1 hash of the string
byte[] bytes = hash.getBytes();
BigInteger big = new BigInteger(bytes);

此代码生成一个 BigInteger,其值为:

811203900027758629330492243480887228261034167773619203962320290854945165232584286910163772258660

我需要以某种方式做(这也是我感到困惑的地方),将这个数字减少到一个更短的数字,并具有固定的小数位数。

结合使用模算术和 Java Math API 函数,有没有一种明智的方法可以将此数字减少为 3 位数字。或者我选择的任何其他长度的数字。

目前我只是简单地将那个巨大的数字转换成一个字符串,然后取一个我想要的数字长度的子字符串。但是我对此并不完全满意,因为我得到的数字并不是随机的,因为范围有限,只有 3 位数字。

这样做的全部目的是将新生成的随机 x 数字数字转换为使用 36 基数的字符串,还包括 ASCII 字母字符。

任何信息或建议将不胜感激。

谢谢!!

【问题讨论】:

  • 所以您想要 3 位数字,但您不想要 3 位数字,因为它们是有限的?我不明白...
  • 他想要 x 位数 - 视情况而定...
  • 该整数是哈希值a9993e364706816aba3e25717850c26c9cd0d89d 的 ASCII 十六进制表示,因此它是所需大小的两倍。谷歌搜索上面显示它是...的哈希,你可以自己谷歌它。

标签: java math random biginteger modulo


【解决方案1】:

是的,您可以使用 .mod(1000) 之类的模数或用于基数 36 .mod(36*36*36) 甚至是普通的 .longValue() % 1000 或 .longValue() % (36*36*36)

您可以使用Long.toString(x, 10) 或Long.toString(x, 36)

如果不给你答案,我不确定我能告诉你更多。

【讨论】:

  • 谢谢彼得,这正是我所需要的!!
  • 注意:这不是完整的答案,但应该为您指明正确的方向。
  • 是的,谢谢。我只是想要一些关于对大量数字进行模块化操作的指示,这就是你给我的。无论如何,我从来没有要求过完整的答案,只是建议:) 谢谢老兄。
  • 因为整数应该是同样随机的,所以你可以使用它的任何部分。例如前三位数字与后三位数字一样好。有很多方法可以做到,所以我会坚持最简单的。
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 2014-11-21
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多