2013-03-05 4 views
0

Я генерирую случайные скрипты, но я должен гарантировать, что каждый новый уникален (ранее не повторялся). Таким образом, каждый скрипт, который уже был сгенерирован, сравнивается с каждым новым скриптом.Сравнение строк несколько раз

Вместо того, чтобы просто использовать обычное сравнение строк, я думаю, что должен быть способ хэширования каждого нового скрипта, чтобы сравнение было быстрее.

Любые идеи о том, как хэш-строки сделать несколько сравнений быстрее?

+0

Вам нужно убедиться, что все строки одинаковы? –

+0

«каждый новый уникален», так что противоположность того, что вы сказали :) –

+0

Вы пробовали HashSet или Словарь для поиска (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 ', который лично использовал для поиска дубликатов в txt-файле размером 500 МБ, это заняло всего пару секунд! –

0

Вы можете использовать HashSet. хэш-набор гарантированно никогда не содержит дубликатов

0

магазин сценарий вместе с его хэш:

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;} 
} 

Затем, когда вам нужно проверить, если ваш новый случайный сценарий уникален просто взять хэш-код из новый скрипт и просмотреть все ваши ScriptData экземпляры для любого с тем же хеш-кодом. Если вы не найдете ни одного знакомого, ваш новый случайный сценарий уникален. Если вы найдете что-то, то может быть таким же, и вам придется сравнивать фактический текст скриптов, чтобы узнать, идентичны ли они.

+0

Вы подразумеваете, что метод GetHashCode может быть шеей бутылки? – juharr

+0

Не обязательно, но если вы собираетесь продолжать пересчитывать его, вы можете также хранить его где-то. – Sean

0

Вы можете хранить каждый сгенерированный string в HashSet.

Для каждой новой строки вы вызовете метод Contains, который работает в сложности O (1). Это простой способ решить, была ли ранее создана новая сгенерированная строка.

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); 

Если вы видите граф из uniqueList вы будете 2. так ABC там не будет в два раза.

Смежные вопросы