static public List <Letter> getHashes(string sInput, byte[] salt) { List <Letter> sArrL = new List <Letter>(); int sLen = sInput.Length; string ltr = ""; string hash = ""; string iHsh = ""; string alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; Letter ltrHash = new Letter("", ""); Random rand = new Random(); int rnd = 0; for (int i = 0; i < sLen; i++) { rnd = rand.Next(0, i + 1); ltr = sInput[i].ToString().ToUpper(); hash = ltr; // Hash.GetHash(ltr, Hash.HashType.MD5); iHsh = Hash.GetHMACSHA1(i.ToString(), salt).Substring(0, 8); //i.ToString(); ltrHash = new Letter(iHsh, hash); sArrL.Insert(rnd, ltrHash); } int l; if (sLen < 26) { l = 26 - sLen; for (int x = 0; x < l; x++) { int r = rand.Next(0, sLen); int ra = rand.Next(0, 25); var rLtr = alpha[ra].ToString().ToUpper(); var rSlt = Salt.RandomSalt(); var rHash = rLtr; //Hash.GetHash(rLtr, Hash.HashType.MD5); var rXHsh = Hash.GetHMACSHA1(r.ToString(), rSlt).Substring(0, 8); //r.ToString(); var rLtrHsh = new Letter(rXHsh, rHash); sArrL.Insert(r, rLtrHsh); } } return(sArrL); }
static void Main(string[] args) { //name in data source 1 var str_1 = "MARTHA"; //name in data source 2 var str_2 = "MARHTA"; //key sent to each data source var salt = Salt.RandomSalt(); //new byte[4] {1, 2, 3, 4}; Stopwatch sw = new Stopwatch(); sw = Stopwatch.StartNew(); //get hashed list array of letter objects //letter object includes letter and position //letter objects are randomly inserted in the list array //random letters for names < 26 characters are randomly inserted in the list array var aList = StringHasher.getHashes(str_1, salt); var bList = StringHasher.getHashes(str_2, salt); var fstHash = sw.Elapsed; sw = Stopwatch.StartNew(); //random letter insertions are eliminated //letters are arranged according to position property of letter object var a_rlLtrs = Decode.CleanList(aList, salt); var b_rlLtrs = Decode.CleanList(bList, salt); var scdHash = sw.Elapsed; sw = Stopwatch.StartNew(); //names are compared using Jaro Winkler SecureJW sJW = new SecureJW(.7, 4); double match = sJW.Match(a_rlLtrs, b_rlLtrs); var jW = sw.Elapsed; //JSON-format serialized output for transport to Shaker JavaScriptSerializer jss = new JavaScriptSerializer(); string ser = jss.Serialize(aList); Console.WriteLine(ser); Console.WriteLine("--------------------------------------------"); foreach (Letter l in aList) { Console.WriteLine(l.Pos.ToString() + ", " + l.Ltr); } Console.WriteLine("--------------------------------------------"); foreach (string r in a_rlLtrs) { Console.WriteLine(r.ToString()); } Console.WriteLine("--------------------------------------------"); foreach (string r in b_rlLtrs) { Console.WriteLine(r.ToString()); } Console.WriteLine("--------------------------------------------"); Console.WriteLine("Match: " + match); Console.WriteLine(fstHash); Console.WriteLine(scdHash); Console.WriteLine(jW); }