2013-03-05 3 views
0

임의의 스크립트를 생성하고 있지만 각각 새로운 스크립트가 고유하다는 것을 보장해야합니다 (전에 반복하지 않았습니다). 따라서 기본적으로 생성 된 각 스크립트는 모든 새 스크립트와 비교됩니다.여러 번 문자열 비교

그냥 정상적인 문자열 비교 대신, 각 새로운 스크립트를 해시하는 방법이 있어야 비교가 더 빠를 것이라고 생각합니다.

다중 비교를 더 빠르게하기 위해 문자열을 해시하는 방법에 대한 아이디어가 있습니까?

+0

모든 문자열이 동일한 지 확인해야합니까? –

+0

"각 새 하나는 독특합니다"그래서 당신이 말한 것과 반대입니다. –

+0

HashSet 또는 Dictionary 을 스크립트 다이제스트와 함께 조회 (O (1) 조회 속도)를 시도 했습니까? – Alex

답변

1

한 가지 방법은 HashSet<String>

HashSetclass는 고성능 설정 작업을 제공합니다 사용하는 것입니다. 집합은 이며 중복 요소가없고요소가 특별한 순서가 아닌 컬렉션입니다. 또한


HashSet<string> scripts = new HashSet<string>(); 

string generated_script = "some_text"; 

if (!scripts.Contains(generated_script)) // is HashSet<String> dont contains your string already then you can add it 
{ 
    scripts.Add(generated_script); 
} 

, 당신은 배열의 duplicate items의 존재를 확인할 수 있습니다. HashSet<String>

string[] array = new[] {"demo", "demo", "demo"}; 
string compareWith = "demo"; 

int duplicates_count = array.GroupBy(x => x).Count(g => g.Count() > 1); 
+0

OP가 문자열 비교가 아닌 파일 해싱을 찾고있는 것으로 보입니다. –

+0

이것은 매우 느릴 것이라고 확신합니다. @Simon 내가 왜 파일 해싱을 찾고 있다고 생각하는지 확신 할 수 없습니다. –

+0

@Spacemonkey -'HashSet '은 파일 크기가 500MB 인 txt 파일에서 중복 된 것을 찾기 위해 개인적으로 사용했습니다. 단지 몇 초가 걸렸습니다! –

0

당신은 HashSet에 사용할 수에 비해 그러나 이것은 매우 효율적하지 않을 수 있습니다. 당신이 당신의 새로운 임의의 스크립트가 고유 한 경우 확인해야 할 때마다

다음
class ScriptData 
{ 
    public ScriptData(string script) 
    { 
    this.ScriptHash=script.GetHashCode(); 
    this.Script=script; 
    } 

    public int ScriptHash{get;private set;} 
    public string Script{get;private set;} 
} 

단지의 해시 코드를 가지고 : 해시 세트는 중복

0

스토어 해시와 함께 스크립트를 포함 결코 보장 새로운 스크립트를 만들고 동일한 해시 코드를 가진 모든 사용자의 ScriptData 인스턴스를 검색하십시오. 만약 당신이 당신의 새로운 임의의 스크립트가 고유하다는 것을 알지 못한다면. 어떤 사람을 찾으면 일 수도 있고 일 수도 있고 스크립트의 실제 텍스트를 비교해야 동일하게 보이는지 확인할 수 있습니다.

+0

'GetHashCode' 메소드가 병목 일 수 있음을 암시하고 있습니까? – juharr

+0

반드시 그런 것은 아니지만, 만약 당신이 그것을 다시 계산할 예정이라면, 어딘가에 그것을 저장할 수도 있습니다. – Sean

0

각각 생성 된 stringHashSet에 저장할 수 있습니다.

각 새 문자열에 대해 O (1) 복잡도로 실행되는 Contains 메서드를 호출합니다. 이렇게하면 생성 된 새 문자열이 전에 생성되었는지 쉽게 판단 할 수 있습니다.

1

사용 HashSet의이 같은

 string uniqueCode= "ABC"; 
     string uniqueCode1 = "XYZ"; 
     string uniqueCode2 = "ABC"; 
     HashSet<string> uniqueList = new HashSet<string>(); 

     uniqueList.Add(uniqueCode); 
     uniqueList.Add(uniqueCode1); 
     uniqueList.Add(uniqueCode2); 

아래에 당신은 당신이 2 그래서 ABC가 두 번되지 않습니다 것 uniqueList카운트 를 참조하십시오.