Самый быстрый способ сравнить несколько значений?

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

if (list.Contains(searchedvalue)) {
    return true;
}

В некоторых случаях мой список может содержать до нескольких сотен или даже тысяч выходных значений, и для его запуска с одним значением потребовалось 2-3 секунды. Я вижу, что многие программы взлома паролей могут генерировать и сравнивать несколько миллионов хеш-значений с входным значением за секунду. Как можно так ускорить прогресс?

код поисковой базы данных. Это просто C# и не имеет ничего общего с базой данных. А как насчет поиска база данных?
Patrick Hofman 26.10.2018 09:16

Используйте базу данных для фильтрации ваших данных, а не вашего кода, когда у вас очень много данных

Esperento57 26.10.2018 09:18
db.DataSet.Any(d => d == searchedValue) с Linq например
Rafalon 26.10.2018 09:19

Инструменты взлома паролей используют Rainbow Tables для обратного подхода к хешу: en.wikipedia.org/wiki/Rainbow_tableyoutube.com/watch?v=8ZtInClXe1Q Я согласен с другими плакатами: не выполняйте поиск в коде. Сделайте как можно больше фильтрации и обработки в самом запросе. Если вы извлечете около 100 полей, вы, вероятно, получите много данных. Добавьте фильтрацию, разбиение по страницам и тому подобное на стороне запроса.

Christopher 26.10.2018 09:21

@PatrickHofman ммм, а не настоящая база данных, просто сравните списки со списками

Dan Minh Toan 26.10.2018 09:22

Ваш вопрос говорит об обратном.

Patrick Hofman 26.10.2018 09:22

Что такое list? Как его получить? Сколько в нем строк?

Patrick Hofman 26.10.2018 09:23

@PatrickHofman просто отредактируйте это

Dan Minh Toan 26.10.2018 09:23

@PatrickHofman Я делаю большой список, который создается из файла (имеет несколько сотен тысяч значений) и сравниваю его с меньшими списками. В основном я использовал цикл для запуска времени мультиплексирования кода для каждого значения, что, очевидно, очень медленно. Я попробовал Parallel, но мне не стало лучше

Dan Minh Toan 26.10.2018 09:37

Загрузите файл в таблицу базы данных (например, с помощью метода массового копирования, если вы используете SQL Server или другой метод импорта в свою базу данных) и сравните с вашей базой данных. Поместите здесь свой полный код и посмотрите, сможем ли мы его оптимизировать

Esperento57 26.10.2018 09:44

Один из методов может заключаться в сортировке ваших двух списков и просмотре вашего списка, если одно слово меньше или равно другому с точки зрения строки. И сохраните позицию последнего найденного слова, чтобы использовать его в следующем искомом слове. Но сам сорт иногда бывает дорогим, чтобы проверить ...

Esperento57 26.10.2018 09:48
0
11
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь на помощь приходят структуры данных. В вашем случае предварительное построение структуры сделает дальнейшие поиски дешевыми. Здесь будет полезен HashSet, например

var set = new HashSet<T>(list);

// repeat
if(set.Contains(searchedvalue)){
    return true
}

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

Другие вопросы по теме