【发布时间】: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