七牛C#语言hash或者etag值计算代码
2016-05-17 15:47
281 查看
七牛C#语言hash或者etag值计算代码
项目代码是采用的控制台应用程序项目。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { class QETag { private int CHUNK_SIZE = 1 << 22; public byte[] sha1(byte[] data) { return System.Security.Cryptography.SHA1.Create().ComputeHash(data); } public String urlSafeBase64Encode(byte[] data) { String encodedString = Convert.ToBase64String(data); encodedString = encodedString.Replace('+', '-').Replace('/', '_'); return encodedString; } static void Main(string[] args) { Console.WriteLine("Usage: qetag <path>-----" + @"c:\test\MyTest.txt"); string path = Console.ReadLine(); QETag etag = new QETag(); try { Console.WriteLine(etag.calcETag(path)); } catch (Exception ex) { Console.WriteLine("Unsupported algorithm:" + ex.Message); } Console.WriteLine("algorithm-hash-etag"); Console.Read(); } public String calcETag(String path) { if (File.Exists(path)) { File.Delete(path); } String etag = ""; FileStream fs ; using ( fs= File.Create(path)) { Byte[] info = new UTF8Encoding(true).GetBytes("This is some text in the file."); fs.Write(info, 0, info.Length); } fs = File.OpenRead(path); long fileLength = fs.Length; if (fileLength <= CHUNK_SIZE) { byte[] fileData = new byte[(int)fileLength]; fs.Read(fileData, 0, (int)fileLength); byte[] sha1Data = sha1(fileData); int sha1DataLen = sha1Data.Length; byte[] hashData = new byte[sha1DataLen + 1]; System.Array.Copy(sha1Data, 0, hashData, 1, sha1DataLen); hashData[0] = 0x16; etag = urlSafeBase64Encode(hashData); } else { int chunkCount = (int)(fileLength / CHUNK_SIZE); if (fileLength % CHUNK_SIZE != 0) { chunkCount += 1; } byte[] allSha1Data = new byte[0]; for (int i = 0; i < chunkCount; i++) { byte[] chunkData = new byte[CHUNK_SIZE]; int bytesReadLen = fs.Read(chunkData, 0, CHUNK_SIZE); byte[] bytesRead = new byte[bytesReadLen]; System.Array.Copy(chunkData, 0, bytesRead, 0, bytesReadLen); byte[] chunkDataSha1 = sha1(bytesRead); byte[] newAllSha1Data = new byte[chunkDataSha1.Length + allSha1Data.Length ]; System.Array.Copy(allSha1Data, 0, newAllSha1Data, 0, allSha1Data.Length ); System.Array.Copy(chunkDataSha1, 0, newAllSha1Data, allSha1Data.Length , chunkDataSha1.Length ); allSha1Data = newAllSha1Data; } byte[] allSha1DataSha1 = sha1(allSha1Data); byte[] hashData = new byte[allSha1DataSha1.Length + 1]; System.Array.Copy(allSha1DataSha1, 0, hashData, 1, allSha1DataSha1.Length ); hashData[0] = (byte)0x96; etag = urlSafeBase64Encode(hashData); } fs.Close(); return etag; } } }
项目代码是采用的控制台应用程序项目。
相关文章推荐
- C# Chart控件,chart、Series、ChartArea曲线图绘制的重要属性
- csharp中DateTime总结-转
- C# 判断 当前设备的IP地址、默认网关、子网掩码在不在同一网段内
- C#验证子网掩码的正确性
- 【C#】给无窗口的进程发送消息
- C#三种字符串拼接方法性能浅析
- 一个牧场目前一共有20头刚出生的羊,母羊、公羊各一半。假如母羊5岁时后每年生一胎(母羊,公羊各一半)。羊活到10岁后死亡。请问20年后这个牧场有多少只羊? 请用C#写出算法。
- C#清除WebBrowser中Cookie缓存的方法
- 第1章 C#概述
- WPF依赖属性
- C#日期时间格式化
- C#中路由事件的使用
- 使用C#解析XMIND文件格式
- c#之xml
- c#解压压缩文件和文件夹
- 用C#一步步写串口通信
- c#泛型使用详解:泛型特点、泛型继承、泛型接口、泛型委托
- C# 爬虫 100个明星贴吧
- C#中泛型方法与泛型接口
- C# default关键字的使用方法