2014-04-02 2 views
1

인용 된 코드는 this answer이지만, 비슷한 코드는 거의 모든 곳에서 볼 수 있습니다. 을 허용하는 System.Security.Cryptography.HashAlgorithm.ComputeHash() 메서드 구현을 사용하여 C# 문자열 콘텐츠를 해시해야한다고 가정합니다. 일반적인 코드는 다음과 같습니다.해시 문자열 샘플에 Encoding.UTF8이 사용되는 이유는 무엇입니까?

public static byte[] GetHash(string inputString) 
{ 
    HashAlgorithm algorithm = MD5.Create(); // SHA1.Create() 
    return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString)); 
} 

문자열은 내부적으로 유니 코드로 저장됩니다.

Encoding.Unicode 대신 Encoding.UTF8이 사용 된 이유는 무엇입니까?

+1

죄송합니다. 그러나이 질문에 대한 객관적인 대답이 어떻게 존재 하는지를 알 수 없습니다. – Jon

+0

@ 존 : "정말 감각이 없습니다"또는 "Encoding.Unicode를 사용하면 이러한 나쁜 일이 발생합니다"와 같은 것입니다. – sharptooth

+0

해당 사항 없음. 그것은 임의적 인 선택입니다. 실제 선택 문제가있는 유일한 방법은 이러한 해시를 계산하는 * 모든 코드가 동일한 인코딩을 사용해야한다는 것입니다. 그렇지 않으면 분명히 동일한 입력을 서로 다른 값에 해시합니다. – Jon

답변

3

왜 Encoding.Unicode 대신 Encoding.UTF8이 사용됩니까?

해시를 선택하는 대부분의 다른 응용 프로그램 프레임 워크에서 사용하는 인코딩입니다. .NET 세계 밖에서는 UTF-16LE 인코딩 (잘못 명명 된 "유니 코드"인코딩)이 반드시 문자열 저장을위한 자연스러운 선택은 아닙니다. UTF-8 이외의 것을 사용하면 다른 시스템에서 생성 된 해시와 상호 운용 할 수 없습니다.

ASCII 전용 입력 데이터의 경우 인코딩이 무시되는 바이트 문자열과 함께 작동하는 모든 소프트웨어에 일치하는 해시가 생성됩니다. 여기에는 많은 PHP 웹 애플리케이션, 순수 자바 웹 애플리케이션 String.getBytes 등이 포함됩니다.

따라서 UTF-8을 사용하면 UTF-8을 사용하는 모든 현대적인 기능과 거의 모든 기능을 갖춘 부분적인 상호 작용을 얻을 수 있습니다. UTF-16을 사용하면 다른 사람과 일치하지 않는 해시를 제공합니다.

해시를 내부적으로 만 사용할 것으로 확신하지만 실제로는 아무 것도 얻지는 않지만 여전히 할 수 있습니다. UTF-8로 인코딩하지 않으면 절약 할 수있는 것은 더 긴 입력 시퀀스를 해시하는 것으로 무효화됩니다. UTF-8은 UTF-16보다 훨씬 효율적인 ASCII 문자이므로 .

관련 문제