문제

가능한 복제 :
C#의 바이트 배열에서 해시 코드를 생성하는 방법

C#에서는 스토리지가 고유한지 확인하기 위해 이미지의 해시를 만들어야합니다.

바이트 어레이로 쉽게 변환 할 수 있지만 거기에서 어떻게 진행 해야할지 잘 모르겠습니다.

.NET 프레임 워크에 나를 도울 수있는 클래스가 있습니까? 효율적인 그런 고유 한 해시를 만들기위한 알고리즘?

도움이 되었습니까?

해결책

.NET에는 암호화 해시를 생성하는 많은 해시 양 제공자가 있습니다.이 조건은 고유 한 상태를 만족합니다 (대부분의 목적으로 충돌 방지). 그들은 모두입니다 극도로 빠르고 해싱은 앱에서 병목 현상이되지 않을 것입니다.

개인적으로 나는 sha1을 좋아한다 :

string hash;
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
    hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}

사람들이 한 방법이 다른 방법보다 느리게 말하면, 그것은 모두 상대적인 용어입니다. 이미지를 다루는 프로그램은 해시섬을 생성하는 마이크로 초 프로세스를 확실히 알 수 없습니다.

그리고 충돌과 관련하여 대부분의 목적을 위해 이것은 또한 관련이 없습니다. MD5와 같은 "쓸모없는"방법조차도 대부분의 상황에서 여전히 매우 유용합니다. 시스템의 보안 일 때만 사용하지 않는 것이 좋습니다. 의존합니다 충돌을 방지합니다.

다른 팁

의 일부 렉스 M의 답변 SHA1을 사용하여 해시를 생성하는 것은 좋은 일입니다 (MD5도 인기있는 옵션입니다). 새로운 암호화 제공 업체를 지속적으로 생성하지 않는 것에 대한 Zvolkov의 제안은 또한 좋은 것입니다 (속도가 사실상 고유 한 독창성보다 속도가 더 중요한 경우 CRC를 사용하는 것에 대한 제안과 마찬가지로.

그러나, 그렇습니다 ~ 아니다 사용 encoding.utf8.getString () 바이트 []를 문자열로 변환합니다 (물론 컨텍스트에서 유효한 UTF8이라는 것을 알지 않는 한). 하나, 그것은 그럴 것입니다 유효하지 않은 surogates를 거부하십시오. 바이트 []에서 항상 유효한 문자열을 제공하도록 보장되는 메소드 convert.tobase64string ().

해시를 계산해야 할 때마다 SHA1CryptoserviceProvider의 새로운 인스턴스 생성은 전혀 빠르지 않습니다. 동일한 인스턴스를 사용하는 것은 매우 빠릅니다.

크립토 그래피를 위해 설계된 해시 함수로 인해 크립토 그래피 해시 대신 많은 CRC 알고리즘 중 하나를 수행하고 싶습니다. 그것이 당신이 원하는 것이라고 가정합니다).

C#에서 CRC를 컴퓨팅하는 한 예에 대해서는이 링크를 확인하십시오. http://sanity-free.org/134/standard_crc_16_in_csharp.html

추신 : 해시가 작아지기를 원하는 이유는 (16 또는 32 비트) 빠르게 비교할 수 있기 때문입니다 (해시가있는 것의 요점이었습니다. 기억하십니까?). 해시가 문자열로 인코딩 된 256 비트 긴 값으로 표현하는 것은 성능 측면에서 매우 미쳤다.

표준 해싱 알고리즘을 사용할 수 있지만 해싱은 기술적으로 고유성을 보장 할 수 없습니다. 해싱은 비교적 빠르거나 작은 토큰으로 설계되어 한 조각의 데이터가 다른 데이터와 동일 할 수 있는지 확인할 수 있습니다. 완전히 다른 데이터 세트가 동일한 해시를 생성 할 수 있지만 이러한 알고리즘을 생성 할 수있는 것은 매우 어렵습니다.

그 모든 것을 제외하고는, 아마도 신원을 확인하기 위해 MD5는 상당히 빠릅니다. SHA는 더 신뢰할 수 있습니다 (MD5는 해킹되었으므로 보안에 사용해서는 안됩니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top