/// <summary> /// Добавляет хеш-файл в анализируемый список /// </summary> /// <param name="filename">Путь до анализируемого файла</param> /// <param name="f">true - добавление в образцы, false - добавление в исследуемые тексты</param> public static void AddFile(string filename, bool f) { //Если выбран служебный файл с хешами if (FileWorking.IsProcessedFile(filename)) { MessageBox.Show("Выбран служебный файл!"); return; } //Если выбран служебный файл с хешами //Проверка, не устарел ли файл с хешами if (FileWorking.IsProcessed(filename)) { if (File.GetLastWriteTime(filename) > File.GetLastWriteTime(filename + ".processed")) { File.Delete(filename + ".processed"); } } //Проверка, не устарел ли файл с хешами //Если требуется хеширование if (!FileWorking.IsProcessed(filename)) { //Хеширование по словам var text = FileWorking.ReadFile(filename).ToString().Replace(".", ""); //Удаление точек List <String> HashList = new List <String>(); var words = text.Split(new char[] { ' ', '\n', '\t' }); foreach (var word in words) { //if (word!="") HashList.Add(WordHash(word).ToString()); if (word != "") { HashList.Add(GetCrypt(word)); } } //Хеширование по словам StringBuilder hash_line = new StringBuilder(); var i = 0; foreach (var hash in HashList) { if (i != HashList.Count - 1) { hash_line.Append(hash.ToString() + ","); } else { hash_line.Append(hash.ToString()); } i++; } File.WriteAllText(filename + ".processed", hash_line.ToString()); if (f == true) { Samples.Add(hash_line.ToString()); } else { Texts.Add(hash_line.ToString()); } } //Если требуется хеширование //Если хеширование не требуется else { if (f == true) { Samples.Add(File.ReadAllText(filename + ".processed")); } else { Texts.Add(File.ReadAllText(filename + ".processed")); } } //Если хеширование не требуется }
/// <summary> /// Проверяет два текста на плагиат /// </summary> /// <param name="text1">Текст-образец</param> /// <param name="text2">Исследуемый текст</param> /// <returns>Возвращает процент уникальности</returns> public static double Check(int text1, int text2) { pieces.Clear(); start_word.Clear(); var doc1 = Samples.GetText(text1); var doc2 = Texts.GetText(text2); //Добавление считанных хешей в массивы var array1 = doc1.Split(new char[] { ',' }); var array2 = doc2.Split(new char[] { ',' }); //Добавление считанных хешей в массивы Int64 unique = array2.Count(); Int64 lenght_of_piece = 0; for (Int64 j = 0; j < array2.Length; j++) { String start = ""; Int64 found = 0; for (Int64 i = 0; i < array1.Length; i++) { if (array1[i] == array2[j] && i < array1.Length - 1) { if (start == "") { start = (array2[j]); } lenght_of_piece++; i++; Int64 k = j + 1; for (; (k < array2.Length) && (i < array1.Length); k++, i++) { if (array1[i] == array2[k]) { lenght_of_piece++; } else { break; } } } var found_lenght = Find(start); if (lenght_of_piece > 3 && found_lenght < lenght_of_piece) { if (found_lenght == 0) { pieces.Add(lenght_of_piece); start_word.Add(start); } else { pieces[FindInStartWord(start)] = lenght_of_piece; } found = lenght_of_piece; } lenght_of_piece = 0; } j += found; } for (int i = 0; i < pieces.Count; i++) { unique -= pieces[i]; } return(100 - 100 * Math.Round((double)unique / (double)array2.Count(), 2)); }