HashBytes 함수에서 올바른 알고리즘 선택 개의 다른 nvarchar 값에 대해 중복

비교 목적으로 nvarchar 데이터의 해시 값을 만들어야합니다. T-SQL에는 여러 가지 해시 알고리즘이 있지만이 시나리오에서 가장 적합한 알고리즘은 무엇입니까?

두 개의 다른 nvarchar 값에 대해 중복 해시 값을 가질 위험이 최소가되도록하려고합니다. 인터넷에 대한 나의 연구에 따르면 MD5가 가장 좋습니다. 맞습니까? MSDN은 사용 가능한 알고리즘에 대해 알려주지 만 (아래 링크 참조) 어떤 조건에 대해 어떤 알고리즘을 설명하지 않습니까?

해시 바이트 (Transact-SQL)

두 개의 nvarchar (max) 열에서 두 개의 테이블을 조인해야합니다. 상상할 수 있듯이 쿼리를 실행하는 데 시간이 걸립니다. 각 nvarchar (max) 데이터의 해시 값을 유지하고 blob 인 nvarchar (max) 값보다는 해시 값에 대한 조인을 수행하는 것이 더 좋을 것이라고 생각했습니다. 문제는 어떤 해시 알고리즘이 고유성을 제공하므로 둘 이상의 nvarchar (max)에 대해 하나의 해시 값을 가질 위험이 없습니다.



답변

HASHBYTES기능은 입력으로 최대 8000 바이트 만 사용합니다. 입력이 그보다 클 수 있으므로 해시되는 필드 범위에서 복제 하면 선택한 알고리즘에 관계없이 충돌 발생합니다. 해시하려는 데이터의 범위를 신중하게 고려하십시오. 처음 4000자를 사용하는 것이 분명한 선택이지만 최선의 선택 이 아닐 수도 있습니다 .

어쨌든 해시 함수의 특성으로 인해 입력이 8000 바이트 이하인 경우에도 결과의 100 % 정확성을 보장 하는 유일한 방법은 특정 시점에서 기본 값을 비교하는 것입니다 (읽기 : 반드시 첫 번째는 아님). 기간.

비즈니스는 100 % 정확도가 필요한지 여부를 지시합니다. 이 기본 값을 비교하거나 (A)가되는 것을 당신에게 말할 것이다 요구 , 또는 (b) 당신이해야 고려 하지 기본 값 비교 – 성능을 절충해야한다 얼마나 정확성을.

고유 한 입력 세트에서 해시 충돌이 발생할 수 있지만 선택한 알고리즘에 관계없이 무한히 드물게 발생합니다. 이 시나리오에서 해시 값을 사용하는 전체 아이디어는 조인 결과를보다 관리하기 쉬운 집합으로 효율적으로 좁히고 최종 결과 집합에 즉시 도달 할 필요는 없습니다. 다시 말하지만, 100 % 정확성을 위해, 이것은 프로세스의 마지막 단계가 될 수 없습니다 . 이 시나리오는 암호화 목적으로 해싱을 사용하지 않으므로 MD5와 같은 알고리즘이 제대로 작동합니다.

“정확성”목적으로 SHA-x 알고리즘으로 올라가는 것을 정당화하는 것은 극히 어려운 일입니다. 왜냐하면 MD5의 작은 충돌 가능성에 대해 비즈니스가 혼란 스러울 경우, 그 가능성 또한 놀라 울 것입니다. SHA-x 알고리즘도 완벽하지 않습니다. 그들은 약간의 부정확성을 가지고 있거나 쿼리가 100 % 정확해야하며 관련 기술에 영향을 미치도록 요구해야합니다. 나는 CEO가 MD5 대신 SHA-x를 사용했다는 것을 알고 밤에 더 잘 자고 있다고 생각합니다. 이 경우 여전히 기술적 관점에서 그다지 큰 의미는 아닙니다.

성능에 관해 말하면, 테이블이 가장 많이 읽히고 조인 결과가 자주 필요한 경우 인덱스 뷰를 구현하여 요청 될 때마다 전체 조인을 계산할 필요가 없도록하십시오. 물론이를 위해 스토리지를 교환해야하지만 특히 100 % 정확도가 필요한 경우 성능 향상에 가치가있을 수 있습니다.

긴 문자열 값 인덱싱에 대한 자세한 내용 을 보려면 단일 테이블에 대해이 작업을 수행하는 방법에 대한 예제를 안내 하고이 질문의 전체 시나리오를 시도 할 때 고려해야 할 사항을 설명 하는 기사게시했습니다 .


답변

MD5는 양호해야하며 출력은 2 진 (16)으로 저장 될 수 있습니다. 물리적 샘플 크기가 크더라도 충돌 확률 ( 생일 역설 참조 )은 여전히 ​​매우 낮습니다. SHA-1의 출력은 20 바이트이고 SHA-256의 출력은 32 바이트입니다. 생일 충돌 확률이 커지는 (실제로는 불가능하거나 적어도 현재 하드웨어 기술로는 실용적이지 않은) 기록이 많지 않으면 괜찮을 것입니다.


답변

SHA-1을 사용하면 사용 가능한 알고리즘 중 더 나은 알고리즘이며 모든 알고리즘 중에서 충돌 예상이 가장 적습니다 (MD5와 비교하여 2 ^ 51, 2 ^ 20.96). MD5는 또한 특정 시나리오에서 충돌에 취약한 것으로 입증되었습니다.

출처 :

http://en.wikipedia.org/wiki/SHA-1
http://en.wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions#Cryptanalysis
http://en.wikipedia.org/wiki/MD5


답변

나는 대답에서 언급 한 것이 아니라 MSDN 에 따라 이것을 보았습니다 .

SQL Server 2016 (13.x)부터 SHA2_256 및 SHA2_512 이외의 모든 알고리즘은 더 이상 사용되지 않습니다. 오래된 알고리즘 (권장하지 않음)은 계속 작동하지만 사용 중단 이벤트가 발생합니다.

내가 물어 비슷한 질문 당신이 (당신이 2016+에 인 경우) 등의 MD5로 사용되지 않는 기능을 사용하려면 당신까지, 그래서를. MD5와 SHA2의 스토리지 및 성능에 차이가 있는지 확인하기 위해 테스트를 수행 할 수 있습니다.


답변