2012-09-08 4 views
-1

C# 및 asp.net mvc에서 URL 단축 시스템을 만들려고합니다. 나는 해시 테이블에 대해 알고 있고 리다이렉트 시스템 등을 만드는 방법을 알고있다. 문제는 데이터베이스에서 긴 URL을 인덱싱하는 것이다. 일부 URL의 문자 길이는 최대 4000 자까지 될 수 있으며 이러한 종류의 문자열을 색인화하는 것은 좋지 않은 것 같습니다. 질문 : 각 URL에 대해 고유 한 짧은 문자열을 만들려면 어떻게해야합니까? 예를 들어 MD5가 도와 줄 수 있습니까? MD5는 각 문자열마다 정말 고유합니까?각각의 고유 한 긴 문자열에 대해 짧은 고유 문자열 만들기

참고 : Gravatar는 이메일에 MD5를 사용하므로 각 이메일 주소가 고유하면 MD5 해시 값이 고유합니다. 맞아? URL에 대해 동일한 솔루션을 사용할 수 있습니까?

+1

MD5는 128 비트이므로 충분히 고유 할 것입니다. –

+3

충돌을 피하기 위해 [완벽한 해시 함수] (http://en.wikipedia.org/wiki/Perfect_hash_function)를 찾으십시오. – HABO

+0

@HABO 좋은 기사와 좋은 해결책. 제안을 답으로 게시하여 받아 들일 것입니다. 덕분에 –

답변

0

perfect hash function 더 충돌을 보장하지 않습니다 하나입니다

(디코딩 할 때 // 나중에 다시 추가 PS 당신은 OFC 항상 HTTP를 제거 처음과 같은 몇 가지 논리를 적용해야합니다). 응용 프로그램이 해시 체인을 수용 할 수 없으므로 완전한 해시가 필요합니다.

+0

그리고 4k 문자열을위한 실용적인 완벽한 해시는 ....? –

+0

@HenkHolterman - 실용적인 완벽한 해시는 확실히 도전입니다. 최소한의 것. OP가 내 의견을 답변으로 다시 보내달라고 요청한 이래로 나는 대답했다. 그것은 나에게 고급 학위에 대한 주제처럼 보입니다. – HABO

2

설명 된 용도로 MD5 또는 SHA1을 사용할 수 있습니다.

해시가 완전히 고유하지 않습니다. 예를 들어, 4000 바이트 배열이 있다면 잠재적으로 256^4000 결합이 가능하다는 의미입니다. 그리고 MD5에는 256^16 조합이있을 것입니다. 따라서 충돌 가능성이 있습니다. 그러나 모든 실제 목적 (암호화 제외)에서는 충돌에 대해 결코 염려하지 않아도됩니다.

당신이 (cryptographical 사용과 관련된) MD5의 collission의 취약점에 대한 실제에 관심이 있다면

, 당신은 그것을 here

0

을 할 수있는 아마 이미 고유하게 식별 할 고유의 짧은 문자열을 만들기 위해 잘 작동합니다 언급 한 해싱 방법 당신의 URL 그러나 대체 접근법을 제안하고자합니다.

ID (정수)와 URL (문자열)의 두 열이있는 데이터베이스 테이블을 만듭니다. 추적하려는 각 URL에 대해 표에 행을 만듭니다. 그런 다음 ID별로 각 URL을 참조하십시오. ID를 자동으로 증가 시키면 고유성이 보장됩니다.

단축 버전에서 긴 버전으로 변환하는 방법에 대한 문제를 해결합니다. 간단히 데이터베이스의 테이블에 가입하십시오. 해싱을 사용하면 해싱이 단방향이므로 문제가 될 수 있습니다. 결과 페이지 식별자는 MD5 해시보다 짧으며 숫자 만 포함하므로 URL 쿼리 문자열 등에 쉽게 포함 할 수 있습니다.

+0

. 하지만 당신은 compelete라는 질문을 읽지 않았다. 나는이 스태프에 대해 안다. 나의 탐침은 URL을 색인하고있다. 색인 문자열이 좋지 않습니다. 그러나 다시 감사합니다 –

+0

당신이 "색인"에 의한 의미를 정의하지 않았기 때문에 귀하의 질문이 명확하지 않습니다. 당신이 말할 수있는 많은 것들이 있습니다. 자신이하려는 일에 대해 실제 세부 정보를 제공하지 않는 한, 적절한 대답을 제공하기가 어렵습니다. 해시를 URL로 다시 변환 할 수 없기 때문에 당신이하려는 일은 전혀 작동하지 않습니다. 귀하의 질문에 대한 실제 문제가 무엇인지 알기가 어렵습니다. –

+0

문제점이 이미 RDBMS 테이블에있는 URL의 RDBMS 색인을 작성하는 것과 관련된 경우, 해시 색인과 같은 일부 RDBMS 특정 메소드를 사용하는 것이 좋습니다. –

0

URL 문자열에서 각 바이트를 만들려고 할 수 있다고 생각합니다. char는 byte가 될 수 있습니다.) 배열을 사용하고 인코딩을 사용합니다 (예를 들어 Base64). 만약 당신이 원한다면 직접 만들 수 있습니다.) 그리고 나서 디코드를 원할 경우, 기본 64 디코딩을 사용하고 바이트에서 (in 배열) 다시 chars. 그러나 나는 그것이 확실하지 않거나 이것이 긴 끈 일 것이거나 아닙니다, 그러나 나는 그것이 유일 할 것이라는 점을 아주 확실하다.

관련 문제