Уменьшить Java BigInteger до фиксированной длины меньшего числа - PullRequest
0 голосов
/ 23 февраля 2012

Я пытаюсь реализовать систему генератора случайных чисел; по сути, я читаю в хэше 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 цифрами.

Цель всего этого состоит в том, чтобы вновь сгенерированное случайное x-значное число затем преобразовывалось в строку с использованием радиуса 36, чтобы также включать символы алфавита ASCII.

Любая информация или советы будут с благодарностью.

Спасибо !!

1 Ответ

1 голос
/ 23 февраля 2012

Да, вы можете использовать модуль, как .mod(1000) или для базы 36 .mod(36*36*36) или даже просто .longValue() % 1000 или .longValue() % (36*36*36)

Вы можете использовать Long.toString(x, 10) или Long.toString(x, 36)

Не уверен, что могу сказать гораздо больше, не дав вам ответа.

...