// Starting at the current position, looks for pairs of locations in the _baselineData & _secondaryData that are byte-wise equivalent. // These are candidiates for where the difference ends. private Dictionary <int, List <int> > FindPotentialRealignments() { byte[] baselineReplayBuffer = _baselineData.ReadBytes(DifferenceCheckWindowSize, out int baselineBytesRead); Span <byte> baselineSpan = baselineReplayBuffer; // setup the baseline lookups Dictionary <string, IList <int> > baselinePositionals = new Dictionary <string, IList <int> >(StringComparer.Ordinal); for (int start = 0; start < baselineBytesRead - PositionalSize; start++) { Span <byte> slice = baselineSpan.Slice(start, PositionalSize); string sliceString = Encoding.Default.GetString(slice.ToArray()); if (!baselinePositionals.TryGetValue(sliceString, out IList <int> positions)) { positions = new List <int>(); baselinePositionals[sliceString] = positions; } positions.Add(start); } byte[] secondaryReplayBuffer = _secondaryData.ReadBytes(DifferenceCheckWindowSize, out int checkBytesRead); Span <byte> secondarySpan = secondaryReplayBuffer; // start looking for "sames" in the check buffer Dictionary <int, List <int> > checkStartToBaselineStartMatches = new Dictionary <int, List <int> >(); int finalCheckSliceStart = Math.Min(baselineBytesRead, checkBytesRead) - PositionalSize; for (int start = 0; start < finalCheckSliceStart; start++) { Span <byte> slice = secondarySpan.Slice(start, PositionalSize); string sliceString = Encoding.Default.GetString(slice.ToArray()); if (baselinePositionals.TryGetValue(sliceString, out IList <int> baselineMatchPositions)) { if (!checkStartToBaselineStartMatches.TryGetValue(start, out List <int> baselineStartPositions)) { baselineStartPositions = new List <int>(); checkStartToBaselineStartMatches[start] = baselineStartPositions; } baselineStartPositions.AddRange(baselineMatchPositions); } } _baselineData.SetupReplayBytes(baselineReplayBuffer); _secondaryData.SetupReplayBytes(secondaryReplayBuffer); return(checkStartToBaselineStartMatches); }