C#でハッシュチェーンを作ってみた。

Cをやってたころは、小難しいアルゴリズム本を読んで、デバッガの16進数のポインタ追っかけてデバッグしていたものですが、C#だとハッシュチェーンが一瞬でできるんですね。

波佐見弁利にユーザー辞書機能をつけて、辞書データをファイルか読み込み、ハッシュチェーンにしました。
画面は以下のURLです。
http://lsl.way-nifty.com/hasamibenri/2011/11/v2-55fe.html

userdicSingleton.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;
using System.IO;

namespace 波佐見弁利v2.DAOs
{
    class UserDicAttr
    {
        public string dicname = string.Empty;
        public string fullpath = string.Empty;
        public int onoff = 0;
    }
    class userdicSingleton
    {
        public const string dicfoldername = "自分辞書";
        private static userdicSingleton singleton_ = new userdicSingleton();

        private static List userdicsInMdb = new List();
        public static List userdicAttrs = new List();
        private static IList dicfiles = null;

        //ユーザー辞書(複数可能)
        private static Dictionary>> dics = new Dictionary>>();

        userdicSingleton() 
        {
        }

        public static void setInit()
        {
            dicfiles = userdicSingleton.findDics();
        }

        private static DataTable selectMdbDics()
        {
            DataTable tbl = null;
            using (DAOContext con = new DAOContext(AccessConstring.conString))
            {
                con.OpenConnection();

                userdicDAO dao = new userdicDAO(con);
                tbl = dao.selectDics();

                con.CloseConnection();
            }

            return tbl;
        }

        private static IList selectMdbDicsIntoList()
        {
            DataTable tbl = userdicSingleton.selectMdbDics();
            List list = new List();

            foreach (DataRow row in tbl.Rows)
            {
                UserDicAttr a = new UserDicAttr();
                a.dicname = row["dicname"].ToString();
                a.fullpath = Application.StartupPath + "\\" + userdicSingleton.dicfoldername + "\\" + a.dicname;
                
                int i = 0;
                int.TryParse(row["ONOFF"].ToString(),out i );
                a.onoff = i;

                list.Add(a);
            }

            return list;
        }

        public static void refleshUserDics()
        {
            DataTable tbl = null;
            userdicSingleton.userdicsInMdb.Clear();

            tbl = userdicSingleton.selectMdbDics();

            foreach (DataRow row in tbl.Rows)
            {
                UserDicAttr a = new UserDicAttr();
                a.dicname = row["dicname"].ToString();
                a.fullpath = Application.StartupPath + "\\" + userdicSingleton.dicfoldername + "\\" + a.dicname;
                
                int i = 0;
                int.TryParse(row["ONOFF"].ToString(),out i );
                a.onoff = i;

                userdicSingleton.userdicsInMdb.Add(a);
            }
        }

        //on = 1 , off = 0
        public static void setOnorOff(string dicname, int onoff)
        {
            using (DAOContext con = new DAOContext(AccessConstring.conString))
            {
                con.OpenConnection();

                userdicDAO dao = new userdicDAO(con);
                dao.updateOnOff(dicname, onoff);

                con.CloseConnection();
            }
        }

        public static void insertUserdic(string dicname)
        {
            using (DAOContext con = new DAOContext(AccessConstring.conString))
            {
                con.OpenConnection();

                userdicDAO dao = new userdicDAO(con);
                dao.insertNew(dicname); //defalut = on(1)

                con.CloseConnection();
            }
        }

        public static IList findDics()
        {
            string fullpathfiles = Directory.GetFiles(Application.StartupPath + "\\" + userdicSingleton.dicfoldername );
            List fns = new List();
            foreach( string path in fullpathfiles )
            {
                string fn = Path.GetFileName(path);

                fns.Add(fn);
            }

            return fns;
        }

        public static Dictionary> parseDicFile(string fullpath)
        {
            Dictionary> dic = new Dictionary>();

            FileStream f= File.Open(fullpath,FileMode.Open);
            StreamReader sr = new StreamReader(f);

            string filecontent = sr.ReadToEnd();

            char sep = { '\n' };
            string lines = filecontent.Split(sep);

            foreach (string line in lines)
            {
                char tab = { '\t' };
                string parts = line.Split(tab);
                if (parts.Length >= 2)
                {
                    try
                    {
                        if (dic.ContainsKey(parts[0]))
                        {
                            if (!dic[parts[0]].Contains(parts[1]))
                            {
                                dic[parts[0]].Add(parts[1]);
                            }

                        }
                        else
                        {
                            List l = new List();
                            l.Add(parts[1]);
                            dic.Add(parts[0], l);
                        }
                    }
                    catch (Exception excp)
                    {
                    }
                }
            }

            sr.Close();
            f.Close();

            return dic;
        }

        public static void syncMdbwithFiles()
        {
           
            IList mdb = userdicSingleton.selectMdbDicsIntoList();

            //MDBにある辞書リストに載っていない辞書フォルダの辞書ファイル名を
            //MDBに登録する
            foreach (string dicname in userdicSingleton.dicfiles)
            {
                bool isExist = false;
                foreach (UserDicAttr attr in mdb)
                {
                    if( dicfiles.Equals(attr.dicname))
                    {
                        isExist = true;
                    }
                }

                if (isExist == false)
                {
                    userdicSingleton.insertUserdic(dicname);
                }
            }

            userdicSingleton.refleshUserDics();
            //追加
            userdicSingleton.dics.Clear();


            //辞書フォルダにある辞書名と一致するMDBの辞書データのみuserdicsに登録する
            userdicSingleton.userdicAttrs.Clear();
            foreach (UserDicAttr attr in userdicSingleton.userdicsInMdb)
            {
                bool isExist = false;
                foreach (string dicname in dicfiles)
                {
                    if (dicname.Equals(attr.dicname))
                    {
                        isExist = true;
                    }
                }

                if( isExist == true )
                {
                    userdicSingleton.userdicAttrs.Add(attr);
                    userdicSingleton.dics[attr] = userdicSingleton.parseDicFile(attr.fullpath);
                }
            }
        }

        //辞書引き
        public static string getTranslatedWords(string keyword)
        {
            List ret = new List();

            foreach (var dickey in userdicSingleton.dics.Keys)
            {
                if (dickey.onoff == 1)
                {
                    if (userdicSingleton.dics[dickey].ContainsKey(keyword))
                    {
                        ret.AddRange(userdicSingleton.dics[dickey][keyword]);
                    }
                    /*
                    foreach (var key in userdicSingleton.dics[dickey].Keys)
                    {
                        if (key == keyword)
                        {
                            ret.AddRange(userdicSingleton.dics[dickey][key]);
                        }
                    }
                     */
                }
            }

            return ret.ToArray();
        }
    }
}


DAOは以下。
userdicDAO.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace 波佐見弁利v2.DAOs
{
    class userdicDAO : MyDAOBase
    {
        public userdicDAO(DAOContext con) : base(con) { }

        public DataTable selectDics()
        {
            string sql = @"select *
                            from userdic
                            order by dicname
                            ";

            return base.GetTable(sql);
        }
        public bool isExistsicname(string dicname)
        {
            string sql = @"select *
                            from userdic
                            where
                                dicname like @pdicname
                            order by dicname
                            ";

            this.ClearParameters();
            this.AddParameter("pdicname", DbType.String, dicname);

            DataTable tbl =  base.GetTable(sql);

            if (tbl.Rows.Count > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //on = 1, off = 0
        public int updateOnOff(string dicname, int onoff)
        {
            string sql = @"update userdic
                            set
                                ONOFF = @ponoff,
                                updated = NOW()
                            where
                                dicname like @pdicname";

            this.ClearParameters();
            this.AddParameter("ponoff", DbType.Int32, onoff);
            this.AddParameter("pdicname", DbType.String, dicname);

            return base.ExecuteNonQuery(sql);
        }

        public int insertNew(string dicname)
        {
            if (this.isExistsicname(dicname))
            {
                return 0;
            }
            string sql = @"insert into
                            userdic(
                                 dicname
                                ,ONOFF
                                ,updated
                            )
                            values(
                                 @pdicname
                                ,1
                                ,NOW()
                            )";

            this.ClearParameters();
            this.AddParameter("pdicname", DbType.String, dicname);

            return base.ExecuteNonQuery(sql);
        }
    }
}