2010-11-25 7 views
0

해시 값을 계산하려고하지만 해시 값은 숫자 (long 또는 integer) 여야합니다.정수 문자열 해시 값

즉, 문자열의 정수 해시를 계산하려고합니다. 내공 걱정은 없습니다.

SHA-256의 MessageDigest를 숫자로 변환하는 방법이 있습니까?

저는이를 위해 Java를 사용하고 있습니다.

+1

찾고있는 것을 설명하는 데 도움이되는 몇 가지 코드를 게시 할 수 있습니까? – Knubo

+0

요구 사항을 지정해야한다고 생각합니다. Java 외부에서 값을 계산해야합니까, 아니면 다른 Java 버전간에 일관되게 값을 계산해야합니까? –

답변

0

Sha 해시는 256 비트를 갖습니다.

"364b7e70a9966ef7686ab814958cd0017b7f19147a257d40603d4a1307662b42" 

이것은 long 및 integer의 범위를 초과합니다. new BigInteger(hash, 16);을 십진수로 사용할 수 있습니다.

public static void main(String[] args) throws NoSuchAlgorithmException { 
     MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
     digest.update("string".getBytes()); 
     byte[] hash = digest.digest(); 
     BigInteger bi = new BigInteger(hash); 
     System.out.println("hex:" + bi.toString(16) + "\r\ndec:" + bi.toString()); 
    } 
1

hashCode() 메소드를 호출 해보세요. 이미 구현되어 있으며 원하는대로 정확하게 수행됩니다.

0

클래스 String에는 문자열을 숫자로 변환하는 다른 Java 클래스와 마찬가지로 hashcode 메서드가 있습니다. 정확한 알고리즘은이 방법의 documentation을 참조하십시오.

1

대부분 분명, 다시 hashCode를 사용하거나 byte 다이제스트에서 배열과 소형이 아래로 당신이 원하는 크기를 취할 수 있습니다, String 숫자로 MessageDigest 등을 변환으로

hashCode() 방법이있다 정수, long 또는 무엇이든 (말하기) xor.

0

자바의 모든 개체는 hashCode() 메서드입니다. 이를 재정의하고 자신의 논리를 지정할 수 있습니다. examples을보십시오.

0

JCE 클래스 (귀하의 경우 MessageDigest)를 사용하여 생성 된 암호화 해시는 본질적으로 일련의 바이트 (SHA-256의 경우 256 비트)입니다. 이러한 숫자를 저장하고 관리하려면 숫자를 BigInteger 또는 BigDecimal 객체로 변환해야합니다 (다이제스트의 길이가 주어짐).

항상 String 개체의 암호화 해시가 계산되는 것은 아니며 대개 비밀의 단방향 암호화 용도로 수행됩니다. 다른 목적으로 해시를 사용하는 경우, 특히 해시 맵에 이러한 개체를 저장할 때 중요 할 수있는 문자열 간의 고유성을 보장하려면 String.hashCode method에서 계산 된 해시 값을 사용하는 것이 좋습니다.