热更新一般需要包含以下东西:
1.URL1:游戏版本配置文件地址
2.URL2:所有资源的MD5配置文件地址
问题
如果将热更新分为强更和弱更(静默更新),以上的更新策略将会不支持静默更新。
新策略
在下载资源到缓冲区后添加一步是否同步文件。如果直接同步文件则为强更,如果不直接同步文件则为静默更新。在下一次进入游戏的时候判断是否有文件未同步–先同步再检查热更新。
++++++++++++++============================================================+++++++++++++++++++
MD5值
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5的md5典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在Unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:
MD5 (tanajiya.tar.gz) = 38b8c2c1093dd0fec383a9d9ac940515
这就是tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。为了让读者朋友对MD5的应用有个直观的认识,笔者以一个比方和一个实例来简要描述一下其工作过程:
大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为司法机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的md5"数字指纹",如果任何人对文件做了任何改动,其MD5值也就是对应的"数字指纹"都会发生变化。
// MD5加密 public static string Encrypt(string txt) { // Create a new instance of the MD5CryptoServiceProvider object. MD5 md5Hasher = MD5.Create(); // Convert the input string to a byte array and compute the hash. byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(txt)); // Create a new Stringbuilder to collect the bytes // and create a string. StringBuilder sBuilder = new StringBuilder(); // Loop through each byte of the hashed data // and format each one as a hexadecimal string. for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } // Return the hexadecimal string. return sBuilder.ToString(); } /** * 解密 * * @param txt * @return */ public static string Decrypt (byte[] bs, string key) { byte[] keys = Encoding.UTF8.GetBytes (key); // 密钥转换成字节数组 int iRandom = bs [bs.Length - 1] & 0xff; byte KRandom = bs [iRandom]; byte[] rb = new byte[bs.Length - 2]; // 异或 for (int i = 0; i < rb.Length; i++) { if (i < iRandom) { bs [i] = (byte)(bs [i] ^ KRandom); rb [i] = (byte)(bs [i] ^ keys [i % keys.Length]); } else { bs [i + 1] = (byte)(bs [i + 1] ^ KRandom); rb [i] = (byte)(bs [i + 1] ^ keys [i % keys.Length]); } } // byte数组还原成字符串 return Encoding.UTF8.GetString (rb); }