문제

웹 페이지의 고유 한 URL을 생성하기 위해 CRC32를 이해하려고합니다.

CRC32를 사용하는 경우 복제를 피할 수 있도록 최대 URL 수는 얼마입니까?

체크섬을 2^32로 유지하는 근사 스트링 길이는 무엇입니까?

UUID를 UUID를 시도하고 UUID 바이트를 기본 64로 변환하면 22 숯으로 줄일 수 있습니다. 더 이상 줄일 수 있을지 궁금합니다.

대부분 URL (최대 1024 숯)을 단락 ID로 변환하고 싶습니다.

도움이 되었습니까?

해결책

CRC32의 "중복을 피할 수 있도록 최대 URL 수를 사용할 수있는 최대 URL 수"와 같은 숫자는 없습니다.

문제는 CRC32가 복제물을 생성 할 수 있으며, 얼마나 많은 값을 던지는 값의 함수가 아니라, 해당 값이 어떻게 보이는지의 함수입니다.

따라서 운이 좋지 않으면 두 번째 URL에 충돌 할 수 있습니다.

고유 한 해시를 생성하는 데 알고리즘을 기반으로하지 말고 각 URL에 대해 수동으로 고유 한 값을 생성해야합니다.

다른 팁

이미 데이터베이스 테이블에 전체 URL을 저장하고 있다면 정수 ID가 꽤 짧고 기본 16, 64 또는 85로 변환하여 짧게 만들 수 있습니다. UUID를 사용할 수 있다면 정수를 사용할 수 있습니다. 그리고 당신도 짧고, 나는 당신의 조회 테이블에서 UUID가 어떤 이점을 제공 할 것인지 알지 못하기 때문에 당신도 할 수도 있습니다.

짧은 URL을 만드는 올바른 방법은 전체 URL을 데이터베이스에 저장하고 행 색인에 매핑하는 것을 게시하는 것입니다. 예를 들어 행 ID의 Base64를 사용하는 것입니다. 또는 기본 키에 UID를 사용하여 표시 할 수 있습니다.

체크섬은 너무 작고 충돌 가능성이 높기 때문에 체크섬을 사용하지 마십시오. 암호화 해시는 더 크고 가능성이 적지 만 여전히 올바른 방법은 아닙니다.

CRC32를 의미합니다 순환 중복 검사 임의의 양의 비트가 32 비트 점검 합계로 합산되는 32 비트로. 합계 함수가 정복적이므로 여러 입력 값이 동일한 출력 값을 갖는 것을 의미합니다. 따라서 함수를 반대 할 수 없습니다.

아니요, MD5 또는 기타 확인 합계조차도 URL이 복제 될 수 있으며 모두 행운에 따라 다릅니다.

그러니 수표 합계에 고유 한 URL 기반을 만들지 마십시오.

사물을 해결하는 가장 빠른 (그리고 아마도 가장 좋은!) 방법은 다음과 같이 주어진 URI의 해시를 단순히 사용하는 것일 수 있습니다.

using System;

namespace HashSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri(
                "http://host.com/folder/file.jpg?code=ABC123");

            string hash = GetPathAndQueryHash(uri);

            Console.WriteLine(hash);
        }

        public static string GetPathAndQueryHash(Uri uri)
        {
            return uri.PathAndQuery.GetHashCode().ToString();
        }
    }
}

상기는 URI 체계와 호스트가 동일하게 유지된다고 가정한다. gethashcode가 아닌 경우 모든 문자열로 작동합니다.

CRC32 해시 충돌에 대한 훌륭한 토론을 위해 : 방문 : http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/821008399831

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