Beispiel #1
0
        /// <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"));
                }
            }
            //Если хеширование не требуется
        }
Beispiel #2
0
        /// <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));
        }