내 웹 응용 프로그램에서 사용자가 업로드 한 이미지의 바이트 배열에서 md5 문자열을 만들려고합니다. 이미지가 다른 폴더에 분산되기를 원하기 때문입니다. 그리고 폴더 이름으로 userID를 사용하지 않아도됩니다. 더 전문적으로 보입니다.업로드 된 이미지의 md5 해시 만들기
/images/ 'first-two-char-of-md5'/'the-complete-md5-string'.[jpg,png,bmp....]
좋은 솔루션으로이 소리가 이미지를 처리하는 않는다 :
결과는 다음과 같을 것이다?
So. 내 코드 (인터넷에서 물건.) :
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, 0, 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, 0, bufferSize)) > 0)
{
md5Hasher.TransformBlock(buffer, 0, readBytes, buffer, 0);
}
md5Hasher.TransformFinalBlock(_emptyBuffer, 0, 0);
return md5Hasher.Hash;
}
결과입니다. "calculateMD5()"에서 출력을 얻지 만 label1에 넣으려고합니다. 무슨 일이 일어나고 있는지 보러. 거기에 사악한 문자가 잔뜩 있습니다. 여기서 내가 뭘 잘못하고 있니? htmlsafe ... a-z, A-Z, 0-9 만 가능합니다.
감사합니다. 같은 이미지를 가진 2 명의 사용자에 대해 제 생각에는 비어있는 (소금기가있는) _emptybuffer 바이트 []에 userID를 추가하여 소금을 추가 할 수 있다고 생각합니까 ?? – Easyrider
예, 작동합니다. MD5는 체크섬을 사용하여 최종 해시를 계산합니다. 'TransformFinalBlock'은 '여기가 데이터의 마지막이며 해시 작업을 마무리합니다'라고 말하는 방법입니다. 또는,'CalculateMD5'에 전달한 스트림의 끝 부분에 추가 데이터를 쓸 수 있습니다 (이미지 데이터를 중간의'MemoryStream'으로 먼저 읽어서 여분의 데이터를 추가하고'MemoryStream'을'CalculateMD5'에 전달할 수 있습니다).). – mdm