2012-02-23 1 views
-1

난수 생성기 시스템을 구현하려고합니다. (어떻게 든해야 할 일은Java BigInteger를 고정 길이로 축소하십시오.

811203900027758629330492243480887228261034167773619203962320290854945165232584286910163772258660 

:

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를 생성 본질적으로 그때를 BigInteger 값으로 변환 누가 받 SHA1 해시에 읽고 있어요 그리고 이것은 내가 혼란스러워하는 곳이다), 고정 소수 자릿수로 그 수를 훨씬 더 짧은 수로 줄인다.

모듈러 연산과 Java 수학 API 함수를 함께 사용하면이 숫자를 3 자리 숫자로 줄일 수 있습니다. 또는 내가 선택한 다른 길이의 번호.

나는 지금 막 엄청난 수를 String으로 변환 한 다음 원하는 수의 길이의 부분 문자열을 취하고 있습니다. 그러나 나는 그 숫자가 3 자리수로 다소 제한되어 있기 때문에 무작위 적이 지 않아서 나는 이것에 완전히 만족하지 않는다.

새로 만든 임의의 x 자릿수를 기수 36을 사용하여 문자열로 변환하여 ASCII 알파벳 문자를 포함하는 것이 모든 목적입니다.

모든 정보 또는 조언을 주시면 감사하겠습니다.

감사합니다.

+3

그래서 3 자릿수를 원하지만 제한되어 있기 때문에 3 자릿수를 원하지 않습니까? 나는 이해하지 못한다 ... – m0skit0

+0

그는 x 자리를 원한다. 상황에 따라 ... – DaveFar

+0

그 정수는 해시 값 'a9993e364706816aba3e25717850c26c9cd0d89d'의 ASCII 16 진수 표현이므로 필요에 따라 두 배가된다. 위의 인터넷 검색은 그것이 ... 글쎄, 당신이 직접 구글의 해시임을 보여줍니다. –

답변

1

예를 일반 .longValue() % 1000 또는 .longValue() % (36*36*36)

당신이 사용할 수있는 .mod(1000)처럼 또는베이스 (36) .mod(36*36*36) 또는에 대한 계수를 사용할 수 있습니다 Long.toString(x, 10) 또는

내가 당신에게 대답을주지 않고 더 많은 것을 알 수 있습니다 확실하지 Long.toString(x, 36).

+0

고마워 피터, 그게 내가 필요한거야! – Tony

+0

참고 : 이것은 완전한 대답은 아니지만 올바른 방향을 제시해야합니다. –

+0

예, 감사합니다. 방금 거대한 숫자의 모듈 식 조작에 대한 몇 가지 지침을 원했고, 그것은 당신이 저에게 준 것입니다. 어쨌든 전체 답변을 요청한 적은 한 번뿐입니다. 감사합니다. – Tony