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

时间:2012-02-23 12:36:40

标签: 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
811203900027758629330492243480887228261034167773619203962320290854945165232584286910163772258660

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

使用模块化算法和Java Math API函数的组合,有一种合理的方法可将此数字减少为3位数。或者我选择的任何其他长度。

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

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

非常感谢任何信息或建议。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

如果不给你答案,我不确定能说些什么。