2009-04-15 4 views
1
I 임의로 문자의 격자를 생성하고, 문자 [] 배열에 저장하고

... 격자를 이진 형식으로 데이터베이스에 직렬화하기 전에 ... 바이트 기반의 두 격자를 비교하는 가장 좋은 방법은 무엇입니까? 마지막으로해야 할 일은 이미 바이트 형식의 DB에서 이들 중 하나를 당겨서 내용을 반복하는 것입니다.개의 문자 배열 놓이지 않도록 동일한 제가 이미 생성되지 않았 음을 확인하는 방법이 필요 <p></p>

체크섬을 생각하고 있었지만 제대로 작동하는지 확실하지 않았습니다. 내가 무엇을 볼 수에서

char[,] grid = new char[8,8]; 
char[,] secondgrid = new char[8,8];//gets its data from db 

답변

2

, 당신은 (그것의 일부, 또는 적어도) 내용을 통해 루프 을 한거야; 배열 내용에 대해 이야기하는 다른 방법은 없습니다.

음, 빨리 "확실히 같은"당신은 배열을 통해 해시 계산 수 - 같은, 즉 뭔가 :이 때이 일부 잘못된 반응의 위험이

int hash = 7; 
    foreach (char c in data) { 
     hash = (hash * 17) + c.GetHashCode(); 
    } 

(A DUP보고를 유일한), 그러나 그렇지 않으면 아주 싸다. 어떤 용도로? 당신은 빠른 체크를 허용하기 위해 데이터베이스의 데이터와 함께 해시를 저장할 수 있습니다 -하지만 그렇게한다면 char에 대한 자신의 해시 알고리즘을 선택해야합니다 (동일하게 유지되는 것이 보장되지 않으므로). 아마도 int로 변환하고, 예를 들어, -하거나 다시 사용하는 기존의 구현 :로

int hash = 7; 
    foreach (char c in data) { 
     hash = (hash * 17) + (c | (c << 0x10)); 
    } 

제쳐두고 - 8 × 8을 위해, 당신은 언제나 64 문자열의 관점에서 생각하고, 단지 ==을 확인할 수 있습니다. 이것은 데이터베이스와 응용 프로그램에서 똑같이 잘 작동합니다.

0

체크섬/해시 메커니즘을 사용하여 일치하는 항목의 비율을 높게 설정 한 다음 일치하는 항목이 있으면 전체 비교를 수행합니다.

그리드를 채우는 데 사용되는 문자의 범위는 무엇입니까? 글자 (대소 문자가 혼합되지 않았거나 중요하지 않음)와 8x8 격자가 사용되는 경우 좋은 해싱을 가정 할 때 문제 공간 내에서 항목 당 7 개 정도의 가능한 충돌 만 (아주 드물게 발생) 기능. 당신이 할 수있는 일 같은 :

  1. 는 DB
  2. 에서 일치하는 그리드 # 2에서 발견 일치, 고토 1
  3. 새 그리드를 사용하는 경우 그리드
  4. 로드를 생성합니다.
1

데이터베이스를 가져올 수 없습니까? 그리드 열을 UNIQUE로 만듭니다. 그런 다음 중복 그리드를 생성했음을 감지해야하는 경우이를 수행하는 방법은 작업의 영향을받는 행 수를 확인하거나 오류를 테스트하는 것과 관련 될 수 있습니다.

또한 각 바이트를 [0, 255]에서 임의로 선택하면 4 바이트 수를 얻기 위해 해시를 수행하는 것이 처음 4 바이트를 그리드 밖으로 가져가는 것보다 낫지 않습니다. 충돌 가능성은 같습니다.

+0

이것은 char [] (byte []가 아닌)이므로 2 문자의 시간 만 가질 것입니다 ... 해시 알고리즘을 사용하면 사용/사용되지 않은 코드 포인트 범위가 더 좋을 것입니다. 일반적인 사용에서) 첫 번째 두 문자를 가져 오는 것보다 더 나은 충돌 속도를 제공합니다. –

+0

글쎄, 내 unknowledge C#을 통해 빛난다. 그러나 나의 첫 번째 요점은 여전히있다. – Artelius

0

이 (모든 행렬 ComputeHash를 호출하고 GUID를 비교) 시도 :

private static MD5 md5 = MD5.Create(); 
public static Guid ComputeHash(object value) 
{ 
    Guid g = Guid.Empty; 
    BinaryFormatter bf = new BinaryFormatter(); 
    using (MemoryStream stm = new MemoryStream()) 
    { 
     bf.Serialize(stm, value); 
     g = new Guid(md5.ComputeHash(stm.ToArray())); 
     stm.Close(); 
    } 
    return g; 
} 

참고 : 당신은 문자 배열이 있기 때문에 바이트 배열이 훨씬 간단 수행 할 수 있습니다 생성.

관련 문제