c# – 创建上传图像的md5哈希值
我正在尝试从用户在我的Web应用程序上传的图像的字节数组中创建一个md5字符串.
这是因为我希望图像分散在不同的文件夹中. 而且我不必使用userID作为文件夹名称.看起来更专业. 结果将是这样的: /images/ 'first-two-char-of-md5' / 'the-complete-md5-string'.[jpg,png,bmp....] 这听起来像处理图像的好方法吗? 所以. protected void btnUpload_Click(object sender,EventArgs e) { if (FileUpload1.HasFile) { if (CheckFileType(FileUpload1.FileName)) { const int BUFFER_SIZE = 255; Byte[] Buffer = new Byte[BUFFER_SIZE]; Stream theStream = FileUpload1.PostedFile.InputStream; nBytesRead = theStream.Read(Buffer,BUFFER_SIZE); System.Text.ASCIIEncoding ASCIIEncoding = new ASCIIEncoding(); System.Text.UTF8Encoding utf8 = new UTF8Encoding(); //Just trying some stuff to see the output... Label1.Text = ASCIIEncoding.GetString(CalculateMD5(theStream)) + "<br>" + utf8.GetString(CalculateMD5(theStream)) + "<br>" + Convert.ToBase64String(CalculateMD5(theStream)); } } } private static byte[] _emptyBuffer = new byte[0]; public static byte[] CalculateMD5(Stream stream) { return CalculateMD5(stream,64 * 1024); } public static byte[] CalculateMD5(Stream stream,int bufferSize) { MD5 md5Hasher = MD5.Create(); byte[] buffer = new byte[bufferSize]; int readBytes; while ((readBytes = stream.Read(buffer,bufferSize)) > 0) { md5Hasher.TransformBlock(buffer,readBytes,buffer,0); } md5Hasher.TransformFinalBlock(_emptyBuffer,0); return md5Hasher.Hash; } 结果.我从“calculateMD5()”获得一些输出,但是当我试图将它放到label1时.看看发生了什么.只有一堆奇怪的角色. 解决方法
散列作为字节数组返回.您需要将其转换为人类可读的形式,例如73868cb1848a216984dca1b6b0ee37bc.您可以使用以下内容:
var s = new StringBuilder(); foreach (byte b in md5Hasher.Hash) s.Append(b.ToString("x2").ToLower()); return s.ToString(); 这将遍历从散列操作返回的字节列表,并将每个字节转换为十六进制.您可以在format strings you can use for the 回答你问题的第一部分:
它应该足够了,但如果2个用户上传相同的图像,那么它将产生相同的哈希值.您可以尝试使用用户名和可能的时间戳来缓存数据以缓解此问题. 您还需要进行一些检查,因为即使概率非常小,您也可能为不同的图像/用户生成相同的哈希(“碰撞”),并且您不希望用户覆盖其他用户的图像.您可以通过生成图像的哈希,检查它是否已经存在来防止这种情况,如果存在,则向预先哈希的数据添加一些字节,重复直到哈希是唯一的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |