将Java BigInteger减少为固定长度较小的数字

将Java BigInteger减少为固定长度较小的数字,java,math,random,biginteger,modulo,Java,Math,Random,Biginteger,Modulo,我正在尝试实现一个随机数生成器系统;本质上,我在读取一个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,其值为: 811

我正在尝试实现一个随机数生成器系统;本质上,我在读取一个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字母字符

如有任何信息或建议,将不胜感激


谢谢

是的,您可以使用模,如
.mod(1000)
或基36
.mod(36*36*36)
或普通
.longValue()%1000
.longValue()%(36*36*36)

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


不知道我能否在不给你答案的情况下说出更多信息。

所以你想要3位数,但你不想要3位数,因为它们有限?我不明白…他想要的是x位-取决于具体情况…这个整数是散列值的ASCII十六进制表示,
a9993e364706816aba3e25717850c26c9cd0d89d
,因此它是需要的两倍大。通过谷歌搜索上述内容,可以发现这是。。。嗯,你可以自己用谷歌搜索。谢谢彼得,这正是我需要的!!注意:这不是完整的答案,但应该为您指出正确的方向。答案是肯定的,谢谢。我只是想要一些关于巨大数字的模块化操作的指针,这就是你给我的。我从来没有问过完整的答案,只是建议:)谢谢,伙计。因为整数应该是同样随机的,你可以使用它的任何部分。e、 g.前三位数字与后三位数字一样好。有很多方法可以做到这一点,所以我会坚持使用最简单的方法。