2009-09-16 2 views
0

우리의 응용 프로그램에서 우리는 자바 객체로부터 해시 코드를 생성하고 그것을 어느 수준에서 데이터베이스에 저장합니다. 내 질문은 누군가가 손으로 숫자를 생성하는 경우, 그것이 객체로부터 JVM에 의해 생성 된 유효한 해시 코드인지 수동으로 수동으로 생성되었는지를 알아낼 수있는 방법이 있는지입니다.해시 코드 유효성을 찾는 방법은 무엇입니까?

+0

그렇게 생각하지 마십시오. 기본 해시 코드 구현을 재정의 (override) 할 수도 있습니다 만, 코드 (또는 그 점에 관해서는 JVM)에 의해 작성되었는지, 직접 작성되었는지는 알 수 없습니다. – wtaniguchi

답변

3

데이터베이스에 개체의 '서명'을 보관하려면 다른 기능을 사용하십시오. hashCode는 추측하거나 리버스 엔지니어링하기가 어렵지 않습니다.

당신이 hashCode를 사용했기 때문에 동일한 F (X) = F (Y)를 갖는 것에 대해 신경 쓰지 않는다고 가정합니다. 여기서 X와 Y는 다른 객체입니다.

실제로 이러한 경우에는 해싱 기능을 사용하고 아마도 "비밀"소금을 사용하는 것을 고려하십시오. 예 :

public static String signature(Object o) 
{ 
    StringBuffer sb = new StringBuffer(); 
    try 
    { 
     MessageDigest md5 = MessageDigest.getInstance("md5"); 
     String st = "SECRET!!1" + o.hashCode(); 
     md5.update(st.getBytes()); 
     sb.append(getHexString(md5.digest())); 
    } 
    catch (NoSuchAlgorithmException e) 
    { 
     throw new RuntimeException("bah"); 
    } 
    catch (UnsupportedEncodingException e) 
    { 
     throw new RuntimeException("bah2"); 
    } 
    return sb.toString(); 
} 

static final byte[] HEX_CHAR_TABLE = 
{ 
     (byte) '0', (byte) '1', (byte) '2', (byte) '3', 
     (byte) '4', (byte) '5', (byte) '6', (byte) '7', 
     (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', 
     (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' 
}; 

public static String getHexString(byte[] raw) throws UnsupportedEncodingException 
{ 
    byte[] hex = new byte[2 * raw.length]; 
    int index = 0; 

    for (byte b : raw) 
    { 
     int v = b & 0xFF; 
     hex[index++] = HEX_CHAR_TABLE[v >>> 4]; 
     hex[index++] = HEX_CHAR_TABLE[v & 0xF]; 
    } 
    return new String(hex, "ASCII"); 
} 
+0

감사합니다. Omry.This 내가 생각했던 그 코드를 공유해 주셔서 감사합니다. – Rajat

3

아니요, 적어도 int 범위에 속하지는 않습니다. int는 유효한 해시 코드입니다. 특히 int 값 x에 대해 new Integer(x) == x의 해시.

그러나 객체의 Java 해시 코드를 저장하는 것은 일반적으로 좋은 생각이 아닙니다. 해시 알고리즘이 지정되어 있고 절대로 바뀌지 않을지라도 괜찮습니까? 그렇지 않으면 문제를 알고리즘이 변경되고 해시가 더 이상 일치하지 않습니다.

1

아니요. 기본 hashCode() 연산은 일관성이 있으면 모든 int를 반환 할 자유가 있습니다. 진짜 질문은 너가하려는 것인가?

1

이렇게 찾을 방법이 없습니다.

관련 문제