2011-02-16 3 views
4

문자열의 해시 코드를 계산하여 'long'변수에 저장해야합니다.MD5 또는 SHA1 해시 코드를 long (64 비트)으로 생성

MD5 및 SHA1은 64 비트 (MD5 - 128 비트, SHA1 - 160 비트)보다 긴 해시 코드를 생성합니다.

아이디어 하나?

건배,

도론

+2

하나의 아이디어가 있습니다. 왜 이럴 필요가 있다고 생각하니? –

+0

@larsmans 그들은 같은 것을 여러 개 생성하지 않고 약한 체크로서 비 암호화 해시로 사용하기를 원하기 때문에 128 비트 코드의 16 진수 문자열을 많이 저장하지 않으려 고합니다. 비트 해시. –

답변

3

당신은 해시를 잘라 그냥 최초의 64 비트를 사용할 수 있습니다. 해시는 다소 덜 강력하지만 처음 64 비트는 여전히 고유 할 가능성이 매우 높습니다.

해시의 대부분의 경우이 방법은 일반적으로 허용되는 방식입니다.

완전한 해시를 두 개의 64 비트 정수로 저장할 수도 있습니다.

+1

보안이 중요한 경우 MD5는 매우 좋지 않은 선택입니다. 비 비밀 데이터의 해쉬를 저장하는 것은 여전히 ​​괜찮습니다. –

+5

나는 "해시의 대부분의 용도에있어서 이것은 공통적이고 완벽하게 수용 가능한 관행"이라고 동의하지 않습니다. 보안 해시는 보안 또는 충돌 속도 이유로 64 비트 해시를 수용 할 수없는 상황에서 자주 사용됩니다. –

+0

@NickJohnson : 늦은 답변에 대해 죄송합니다 (몇 년이 지났습니까?). 사실, 보안 해시는 64 비트 이상이어야합니다. "해시의 가장 큰 용도"에 대해 언급했음을 주목하십시오. 보안상의 해시는 많은 기본적인 데이터 구조가 성능상의 이유로 해시를 사용할 때 버킷에 드롭되는 것과 같습니다. –

0

비트를 함께 배타십니까? 예 : MD5의 경우 비트 0-63 XOR 비트 64-127, 바이트, 64 비트. 이렇게하면 더 약한 해쉬를 얻을 수 있습니다.

+0

XOR 비트를 함께 사용할 필요가 없습니다. 안전한 해시에서는 모든 하위 집합으로 충분합니다. –

1

FNV Hash은 구현하기가 매우 쉽다 (- - 예를 들어, 임베디드 디바이스 환경이 매우이 제한된 경우가 아니면, "? 왜 필요 그것을 단축 않는다"의 문제가있다). 64 비트로 확장 했으므로 잘 작동합니다. MD5 또는 SHA1을 계산 한 다음 결과를 잘라내는 것보다 훨씬 빠릅니다. 그러나 해시 테이블 등의 암호화 기능에는 의존하지 않습니다. 소스 코드와 자세한 설명과 함께 FNV에

더 많은 정보 : http://isthe.com/chongo/tech/comp/fnv/

0

또한 나는이 (자바)를 사용하고 FooBabel Hasher과 다양한 해시 알고리즘

1

을 재생할 수 있습니다 :

public class SimpleLongHash { 
    final MessageDigest md; 
    // 
    public SimpleLongHash() throws NoSuchAlgorithmException { 
     md = MessageDigest.getInstance("MD5"); 
    } 
    // 
    public long hash(final String str) { 
     return hash(str.getBytes()); 
    } 
    public long hash(final byte[] buf) { 
     md.reset(); 
     final byte[] digest = md.digest(buf); 
     return (getLong(digest, 0)^getLong(digest, 8)); 
    } 
    // 
    private static final long getLong(final byte[] array, final int offset) { 
     long value = 0; 
     for (int i = 0; i < 8; i++) { 
      value = ((value << 8) | (array[offset+i] & 0xFF)); 
     } 
     return value; 
    } 
} 
0

처음 64 비트와 마지막 64 비트 사이의 XOR 결과로 충돌 가능성은 어떻게됩니까?