static void CheckStringsForHashCollisions(List <string> strings, HashType hash) { var makeHash = HashManager.GetHashFunction(hash); var lineComparer = HashManager.GetStringComparer(hash); var hashMap = new Dictionary <UInt32, string>(); var buffer = new List <string>(); foreach (var line in strings) { var lineHash = makeHash(line); if (hashMap.ContainsKey(lineHash)) { var testLine = hashMap[lineHash]; if (!lineComparer.Equals(line, testLine)) { buffer.Add(string.Format("INPUT_COLLISION\t0x{0:X8}\t{1}\t{2}", lineHash, testLine, line)); } } else { hashMap.Add(lineHash, line); } } if (buffer.Any()) { Console.WriteLine("#INPUT_COLLISION\tHash\tLine_1\tLine_2"); buffer.Sort(); buffer.ForEach(s => Console.WriteLine(s)); Console.WriteLine(""); } }
static void SortFolder(string inputFolder, HashType hash) { var makeHash = HashManager.GetHashFunction(hash); var files = Directory.GetFiles(inputFolder, "*.txt", SearchOption.AllDirectories); var sw = Stopwatch.StartNew(); foreach (var fileName in files) { Console.WriteLine(fileName + " - Processing file..."); var fileData = new Dictionary <UInt32, List <string> >(); var fileLines = File.ReadAllLines(fileName); foreach (var line in fileLines) { var hashValue = makeHash(line); List <string> hashLine; if (!fileData.TryGetValue(hashValue, out hashLine)) { hashLine = new List <string>(); fileData.Add(hashValue, hashLine); } hashLine.Add(line); } var soretedLines = new List <string>(); foreach (var line in fileData) { if (line.Value.Count == 1) { soretedLines.Add(line.Value.First()); } else { var test = line.Value.Distinct(HashManager.GetStringComparer(hash)).ToList(); if (test.Count == 1) { soretedLines.Add(test.First()); } else { Console.WriteLine("Hash Collision found, hash = 0x" + line.Key.ToString("X8")); foreach (var s in test) { Console.WriteLine(s); } Console.WriteLine(""); return; } } } soretedLines.Sort(); File.WriteAllLines(fileName, soretedLines); } sw.Stop(); Console.WriteLine("Files processing done in " + sw.Elapsed.ToString()); }
static void CheckStrings(string inputFolder, HashType hash, List <string> strings) { var converter = new UInt32Converter(); var makeHash = HashManager.GetHashFunction(hash); var lineComparer = HashManager.GetStringComparer(hash); var files = Directory.GetFiles(inputFolder, "*.hashes", SearchOption.AllDirectories); var testData = strings.Select(s => new KeyValuePair <UInt32, string>(makeHash(s), s)).ToList(); var bufferCollisions = new List <string>(); var bufferNew = new List <string>(); foreach (var fileName in files) { var hashList = File.ReadAllLines(fileName).Select(s => (UInt32)converter.ConvertFromString(s)).ToDictionary(k => k, v => v); var lines = File.ReadAllLines(Path.ChangeExtension(fileName, ".txt")).ToDictionary(k => makeHash(k), v => v); var localFileName = fileName.Remove(0, inputFolder.Length + 1); foreach (var test in testData) { if (hashList.ContainsKey(test.Key)) { string currentValue; if (lines.TryGetValue(test.Key, out currentValue)) { if (!lineComparer.Equals(currentValue, test.Value)) { bufferCollisions.Add(string.Format("COLLISION\t{0}\t{1}\t{2}", localFileName, currentValue, test.Value)); } } else { bufferNew.Add(string.Format("NEW\t{0}\t{1}", localFileName, test.Value)); } } } } if (bufferCollisions.Any()) { Console.WriteLine("#COLLISION\tFile_name\tCurrent_line\tInput_line"); bufferCollisions.Sort(); bufferCollisions.ForEach(s => Console.WriteLine(s)); Console.WriteLine(""); } if (bufferNew.Any()) { Console.WriteLine("#NEW\tFile_name\tInput_line"); bufferNew.Sort(); bufferNew.ForEach(s => Console.WriteLine(s)); Console.WriteLine(""); } }