记一次MD5妙用
记一次MD5妙用
最近项目组中在做历史记录的改造工作,主持讨论了多次,但每次讨论完都觉的很完美了,但实际在写这部分逻辑的时候还是会发现一些问题出来,很难受,反反复复的暴露智商是硬伤,人艰不拆,暂先不扯这些真相了。介绍下实际操作场景,我们的项目是分设计端和运行端的,就是设计端设计的内容保存在数据文件中,运行端去解析该文件,展示设计的内容,其中历史记录部分就是其中一项功能,该功能包括采集外部设备的数据,以及使用表格和曲线来展示数据。但这里有一个要求就是,同一个工程的历史数据文件不能每次下载就新建这个历史数据文件,必须要判断有无更改了历史记录配置,如果有更改则可以重建,否则就不能新建去存储,第一次讨论时就已经考虑到这一点了,确定了是由运行端去比较是否有更改。运行端人员写了一下,发现这个比较很麻烦,因为运行端是在一个嵌入式设备上运行的,内存,硬盘这些都很小,cpu处理也很慢,不仅麻烦,而且运行处理速度也很慢,提出由设计端人员给个标志位,这就是第二次讨论的时候提到的,设计端给出的方案是每次有编辑历史记录部分就置位某个值,下载后,就复位该值。这对于设计端来说也简单,就定了。后面又发现,咱这个设计的数据文件是可以下载到多台设备上的,每次下载完就复位的话,下载到另一台的时候不就没有这个标志位了嘛,这不行啊,同一工程导致两种运行端解析方式,这是不可接受的。然后进行了第三次讨论,有提到说使用历史记录修改版本来区分开来,这是一个感觉还不错的方式。下载到设备上后,设备用当前的那个工程的历史记录版本号与最新的下载的工程中的历史记录版本号进行比对,如果不一样就可以新建,否则不新建,可接着进行记录。这个方式是解决了之前那个问题,但又发现新的问题来,就是设计端更改了历史记录配置后保存,然后又更改历史记录配置,使之和原来的设置是一样的,这时候版本是有更新的,但实际配置没有变化,如果这种情况下载进去,历史数据又新建,显然是不合适的。忽然灵光一闪,这个场景熟悉,判断前后设置是否有修改,可以使用md5计算一下配置信息存在某个地方,下载到设备上后,设备对这个md5值和原来配置的那个记录进行比较,如果相同,则无需新建,否则新建,这个处理方式就避免了更改了配置,又将配置还原为原来配置的问题,这里利用了md5一对一的特点,巧妙的解决了这个问题。但愿这次的讨论能够周全了。2018-09-27 18:21:00
最后附上C#中对MD5的计算方法
public static string GetMD5String(string str)
{
MD5 md5 = MD5.Create();
byte[] data = Encoding.UTF8.GetBytes(str);
byte[] data2 = md5.ComputeHash(data);
return GetByteToString(data2);
}
public static string GetByteToString(byte[] data)
{
StringBuilder sb = new StringBuilder();
for(int i = 0; i < data.Length; i++)
{
sb.Append(data[i].ToString("x2"));
}
return sb.ToString();
}
记一次MD5妙用的更多相关文章
- js和java MD5加密
项目中用到js MD5加密和后台java MD5加密,刚开始加密后两个不一致,网上找了好久终于找到一个啦,记下来: md5.js /* * A JavaScript implementation of ...
- WC2019 填坑记
2019年1月8日 1.Luogu P2147 [SDOI2008]洞穴勘测 (LCT模板题&LCT学习) 2019年1月9日 2.LuoguP3203 [HNOI2010]弹飞绵羊 (LC ...
- 记一次加密算法MD5
通过MessageDigest可以获取到16个字节数组: MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] ...
- 记一次npapi插件无窗口(windowless )化下的妙巧思路然后解决问题的超爽体验过程
1:问题 集成第三方的ocx控件,用来做pdf显示和签名.如果用窗口化插件做,很简单,加载ocx到窗口中,再显示到网页即可.但这样有个缺点.就是这个窗口会浮动在网页元素的上面,导致遮挡住网页元素.比 ...
- 【java基础】妙记进制转换
一.二进制与十进制 1.正整数十进制转二进制 口诀:除二取余,倒序排列 解释:将一个十进制数除以二,得到的商再除以二,依此类推直到商等于一或零时为止,倒取将除得的余数,即换算为二进制数的结果 例如把5 ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- 北京培训记day2
后缀三姐妹 P.S.后缀大家族关系:后缀自动机fail指针=后缀树,后缀树前序遍历=后缀数组 一.后缀数组:orz罗穗骞集训队论文 给每个后缀按字典序排序 rank[]表示从i开始的后缀排名多少 sa ...
- APK瘦身记,如何实现高达53%的压缩效果
作者:非戈@阿里移动安全 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律. ...
- MD5实现32位加密
好记性不如烂笔头,随手记记 附代码 public static void Main(string[] args) { Console.WriteLine("长度为" + UseMd ...
随机推荐
- Spring MVC controller控制器映射无法访问问题!!!
月 26, 2019 2:47:58 上午 org.apache.coyote.AbstractProtocol start信息: Starting ProtocolHandler ["aj ...
- 漫谈C++:良好的编程习惯与编程要点(转载)
这个博主写的文章真是细腻,全面,严谨,应当多读几回 原文http://www.cnblogs.com/QG-whz/p/5517643.html 阅读目录 以良好的方式编写C++ class Clas ...
- springboot(服务端接口)获取URL请求参数的几种方法
原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 一.下面为7种服务端获取前端传过来的参数的方法 常用的方法为:@RequestParam和@Req ...
- sparkStreamming原理
一.Spark Streamming 是基于spark流式处理引擎,基本原理是将实时输入的数据以时间片(秒级)为单位进行拆分,然后经过spark引擎以类似批处理的方式处理每个时间片数据. 二.Spar ...
- 解决 Database Configuration Assistannt安装oracle实例使的 警告
在创建到85%的时候报错,错误如下: 解决办法: 经过查看警告中给出的日志文件F:\develop\oracle_data\app\Administrator\cfgtoollogs\dbca\tes ...
- 学校管理系统C#(数据库、源码、演讲内容、ppt等)
该系统使用C#语言编程 在学院项目展获取第一名 git地址:https://github.com/weibanggang/schoolsystem
- mysql时间日期函数
now(), current_timestamp(); -- 当前日期时间 current_date(); -- 当前日期 current_time(); -- 当前时间 date('yyyy-mm- ...
- P1666 前缀单词
P1666 前缀单词 tire树上跑dp 首先将trie树建出来,然后对于每个节点.考虑他的子节点. 子节点的方案数都互不干扰,所以子节点与其他子节点的的方案数可以利用乘法原理算出来. 然后如果这个节 ...
- UGUI防止点击穿透
if (!IsPointerOverGameObject(Input.mousePosition)) { } public static bool IsPointerOverGameObject(Ve ...
- 并发编程之多线程基础-Thread和Runnable的区别及联系(二)
上篇文章讲述了创建线程的常用方式 本篇主要分析一下Thread和Runnable两种方式创建线程的区别及联系 联系: ▶Thread类实现了Runable接口. ▶都需要重写里面Run方法. 区别: ...