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 ListuserdicsInMdb = 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 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(); 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 l = new List getTranslatedWords(string keyword) { 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 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); } } }