문제

나 테스트 VB 기능은 아래에서 얻은 구글에 검색합니다.내 계획을 생성하는 데 사용 해시 코드에 대한 빠른 문자열을 비교합니다.그러나는 경우가 있는 두 개의 서로 다른 문자열은 같은 해시 코드입니다.예를 들어,이러한 문자열

"122Gen1 힙 크기(.NET CLR 메모리 w3wp):mccsmtpteweb025.20833333333333E-02"

"122Gen2 힙 크기(.NET CLR 메모리 w3wp):mccsmtpteweb015.20833333333333E-02"

같은 해시 코드의 237117279.

말해주십시오: 무엇인가-잘못된 기능이?-How can I fix it?

감사


Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, src As Any, ByVal bytes As Long)

Private Function HashCode(Key As String) As Long
  On Error GoTo ErrorGoTo

  Dim lastEl As Long, i As Long
  ' copy ansi codes into an array of long'
  lastEl = (Len(Key) - 1) \ 4
  ReDim codes(lastEl) As Long
  ' this also converts from Unicode to ANSI'
  CopyMemory codes(0), ByVal Key, Len(Key)
  ' XOR the ANSI codes of all characters'

  For i = 0 To lastEl - 1
    HashCode = HashCode Xor codes(i) 'Xor'
  Next

ErrorGoTo:
  Exit Function
End Function
도움이 되었습니까?

해결책

나는 내가 있는 이상"경우에"때 두 문자열을 생성하는 같은 해쉬를 사용하여 귀하의 기능입니다.사실,그것은 아마 보다 더 자주 발생을 생각합니다.

몇 가지 실현:

첫째,있을 것입니다 hash 충돌 사고로 이어질 수 있습니다.그것은 발생합니다.으로도 정말,정말 큰 공간 MD5(128 비트)여전히있다 두 문자열을 생성할 수 있는 동일한 결과로 해시입니다.당신이 다루는 사람들과 충돌을 만들어 버킷 등이 있습니다.

둘째,오래 정수 정말 큰 해시 공간입니다.당신이 얻는 더 많은 충돌하는 것보다 당신이 사용한 경우 더 비트입니다.

셋째,라이브러리에서 사용할 수 있 Visual Basic(니다.인터넷 System.Security.Cryptography 네임스페이스)할 것입니다 훨씬 더 나은 작업의 해싱보다 가장 단순한 인간.

다른 팁

두 문자열은 동일한 문자입니다.(참고로'2'과'1'는 플립 실패)

그 이유는 해쉬값은 동일합니다.

는지 확인 해시 기능이 계정에는 문자의 순서.

해쉬 기능을 보장하지 않는 고유성의 해쉬값입니다.는 경우에 입력값 범위(판단의 샘플 문자열)보다 더 큰 출력 값의 범위(예:32bit integer),그 독창성은 물리적으로 불가능합니다.

는 경우 가장 큰 문제는 계정의 위치에 대한 바이트를,당신은 그것을 고칠 수 this:

Private Function HashCode(Key As String) As Long
  On Error GoTo ErrorGoTo

  Dim lastEl As Long, i As Long
  ' copy ansi codes into an array of long'
  lastEl = (Len(Key) - 1) \ 4
  ReDim codes(lastEl) As Long
  ' this also converts from Unicode to ANSI'
  CopyMemory codes(0), ByVal Key, Len(Key)
  ' XOR the ANSI codes of all characters'

  For i = 0 To lastEl - 1
    HashCode = HashCode Xor (codes(i) + i) 'Xor'
  Next

ErrorGoTo:
  Exit Function
End Function

유일한 차이점은 그것이 문자를 추가하는 위치의 바이트 값 앞에 XOR.

아 해쉬 기능을 보장할 수 있습니다.가 있~4 억 32 비트의 정수,그래서 심지어 최고의 해쉬 기능을 생성할 것이 중복 제시하는 경우~4 억 1 문자열은(대부분이 오래 전에).

움직이는 64 비트 해시 또는 128 비트 해시가 없는 솔루션이지만,그 가능성을 감소시키고 충돌이 발생합니다.

하려면 더 좋은 해쉬 기능은 당신이 볼 수있는 암호화 해시,하지만 더 나은 것을 재고해 당신이 알고리즘을 결정할 수 있는 경우 거래와 충돌 몇 가지 다른 방법이있다.

시스템입니다.보안입니다.암호화 네임스페이스를 포함하는 여러 수업을 할 수 있는 해시 당신을 위해(등 MD5)는 것입니다 아마도 해시 그들에게 보다 더 나은 당신 자신을 것이다 많은 노력이다.

당신은 항상 필요가 없 바퀴를 재발견 할 수 있습니다.

간단한 XOR 것은 좋은 해쉬:를 많이 찾을 수 있는 문자열 아케이드 게임이 아닙니다.해쉬에 의존하지 않는 글자의 순서에는 문자열이 한 것입니다.

사용하십시오 FNV 해시 http://isthe.com/chongo/tech/comp/fnv/

이것은 정말 간단하게 구현할 수 있습니다.그것은 변화를 해시 코드 후 각 XOR,그래서 같은 문자는 다른 순서로 생성하는 다른 해시입니다.

해쉬 기능을 의미하지 않는 고유한 값을 반환에 대한 별개의 문자열입니다.그러나,좋은 해쉬 기능을 반환해야 합니다 다른 값을 문자열에는 비슷하게 생겼습니다.해쉬 기능을 사용하여 검색에 대한 많은 것을 포함한 이유를 찾으로 큰 컬렉션입니다.면 해쉬 기능이 좋은 경우 반환 값 범위는 0,N-1],다음의 큰 컬렉션 M 이에서 분할 N 컬렉션,각각의 하나는 대 M/N 요소입니다.이 방법은,당신은 필요합에서만 검색하의 배열 M/N 요소를 대신에서 검색하의 배열 M 요소입니다.

하지만,당신은 단지는 2 개의 문자열입 빠르게 계산하는 해쉬값을 사람들을 위해!그 을 비교한 두 개의 문자열입니다.

는 interresing 해쉬 기능을 수 있습니다.



    unsigned int hash(const char* name) {
      unsigned mul=1;
      unsigned val=0;
      while(name[0]!=0) {
        val+=mul*((unsigned)name[0]);
        mul*=7; //you could use an arbitrary prime number, but test the hash dispersion afterwards
        name++;
      }
      return val;
    }

고정하는 구문 강조하셨습니다.

또한,사람들을 위해 확실하지 않았다는 환경에 대해 또는 제안이 더 안전한 해쉬:그것의 고전(pre-.Net)VB 때문이다.Net 괄호가 필요한 이 호출을 CopyMemory.

IIRC 이 없는 안전한 해시장에서 클래식 VB.많은 거기에 웹에서 하나므로,이 수 있습니다 자신의 최선의 방법이다.

I don't quite see 환경에서 작업.은 이것입니다.순 코드?당신이 정말로 원하는 경우 좋은 해시 코드,내가 추천하는 것으로 보고 암호 해시(입증된 알고리즘)하는 대신 자신을 작성합니다.

Btw,당신은 귀하의 게시물을 편집하고 코드를 붙여서로 코드 샘플십시오(toolbar)?이 것이 그것을 쉽게 읽을 수 있습니다.

"그렇게 하지 않습니다."

쓰기에 자신의 해쉬 기능을 하는 것은 큰 실수하기 때문에,당신의 언어 확실히 이미의 구현 SHA-1,완벽히 좋은 해쉬 기능입니다.만 필요하다면 32 비트(대신 160SHA-1 제공하는)사용,마지막의 32 비트를 SHA-1.

이 특별한 해쉬 기능을 배타적 가산하여 모든 문자는 문자열을 사용합니다.불행하게도 XOR 연관:

(a XOR b) XOR c = a XOR (b XOR c)

그래서 어떤 문자열은 동일한 입력된 문자에서 같은 해시 코드입니다.두 문자열을 제공하는 제외하고는 같은 위치에 대한 두 개의 문자,따라서 그들은 동일해야 합 차이.

할 수 있습을 찾을 필요가 더 잘 알고리즘,MD5 것이 좋은 선택이 될 것입니다.

XOR 작업환;즉,XORing 모든 문자는 문자열의 순서는 문자를 중요하지 않습니다.모든 아나그램의 문자열이 생산하는 동 XOR 해시입니다.

예에서,당신의 두 번째 문자열에서 생성할 수 있습니다 당신의 첫 번째 교환하여"1"이 후에"...세대"처음"2"합니다.

거기에 아무것도 잘못된 기능이다.모든 유용한 해싱 기능을 것입니다 때때로 생성 충돌 및 프로그램 준비를해야합니다.

충돌이 발생하는 경우 입력이 표시 값을 이미 확인과 이전의 입력이 있습니다.은 경우 해싱 알고리즘을 생성할 수 없었습니다.충돌,해시 값을 필요로 큰 것으로 입력 값입니다.같은 해싱 알고리즘의 제한된 사용에 비해 저장하는 입력 값입니다.

-Al.

가의 시각적 기본적인 구현 MD5 해싱하기

http://www.bullzip.com/md5/vb/md5-visual-basic.htm

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