public int SearchWithDiff(string src, string sub, int diff) { int srcLen = src.Length; int subLen = sub.Length; if (srcLen < subLen) return -1; RkSearchHash hash = new RkSearchHash(); long target = hash.GenerateHash(sub); long rolHash = hash.GenerateHash(src.Substring(0, subLen)); int i = 0; int limit = srcLen - subLen; int rolDiff = 0; for (i = 0; i < limit; i++) { rolDiff = CountSetPairs((ulong)(target ^ rolHash)); if (rolDiff <= diff) { return i; } rolHash = hash.GenerateRollingHash(src[i], src[i + subLen], rolHash, subLen); } rolDiff = CountSetPairs((ulong)(target ^ rolHash)); if (rolDiff <= diff) { return i; } return -1; }
public int Search(string src, string substr) { int srcLen = src.Length; int subLen = substr.Length; if (srcLen < subLen) return -1; RkSearchHash hash = new RkSearchHash(); long target = hash.GenerateHash(substr); long rolHash = hash.GenerateHash(src.Substring(0, subLen)); int i = 0; int limit = srcLen - subLen; for (i = 0; i < limit; i++) { if (rolHash == target) { return i; } rolHash = hash.GenerateRollingHash(src[i], src[i + subLen], rolHash, subLen); } // Avoid per loop comparison, of i + susbstr.Length if (rolHash == target) { return i; } return -1; }
public void TestHash() { RkSearchHash hash = new RkSearchHash(); long h = hash.GenerateHash("ACGT"); Console.WriteLine("h: {0}", h); //Generate rolling hash for CGTA h = hash.GenerateRollingHash('A', 'A', h, 4); Console.WriteLine("h: {0}", h); Assert.AreEqual(h, hash.GenerateHash("CGTA")); //Generate rolling hash for GTAG from CGTA h = hash.GenerateRollingHash('C', 'G', h, 4); Console.WriteLine("h: {0}", h); Assert.AreEqual(h, hash.GenerateHash("GTAG")); }