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);
        }
Пример #2
0
        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);
        }