1

データベースに保存された画像が同じであることを比較して、I/O を節約する最良の方法は何ですか。

シナリオ:

Entity Framework を使用して MVC3 で ASP.NET アプリケーションを作成しています。UserProfile コントローラのEditアクション メソッドがあります。ここで、メソッドに投稿した画像が異なることを確認したいと思います。異なる場合は、 ObjectContext を呼び出します。同じ画像の場合はSaveChanges() 、次に進みます。

これが私のコードの縮小版です:

    [HttpPost, ActionName("Edit")]
    public ActionResult Edit(UserProfile userprofile, HttpPostedFileBase imageLoad2)
    {
        Medium profileImage = new Medium();

        if (ModelState.IsValid)
        {
            try
            {
                if (imageLoad2 != null)
                {
                    if ((db.Media.Count(i => i.Unique_Key == userprofile.Unique_Key)) > 0)
                    {
                        profileImage = db.Media.SingleOrDefault(i => i.Unique_Key == userprofile.Unique_Key);
                        profileImage.Amend_Date = DateTime.Now;
                        profileImage.Source = Images.ImageToBinary(imageLoad2.InputStream);
                        profileImage.File_Size = imageLoad2.ContentLength;
                        profileImage.File_Name = imageLoad2.FileName;
                        profileImage.Content_Type = imageLoad2.ContentType;
                        profileImage.Height = Images.FromStreamHeight(imageLoad2.InputStream);
                        profileImage.Width = Images.FromStreamWidth(imageLoad2.InputStream);

                        db.ObjectStateManager.ChangeObjectState(profileImage, EntityState.Modified);
                        db.SaveChanges();

                    }
                }
            }
        }

そのため、イメージを varbinary(max) として SQL Server Express DB に保存します。これは、エンティティでバイト配列として参照されます。

ポストからバイト配列をループし、それを ObjectContext に引き戻されたバイト配列と比較するだけの場合ですか?

4

1 に答える 1

3

バイト配列を直接比較するのではなく、画像のハッシュを比較します。おそらく、次のようなものが比較メソッドに抽出される可能性があります。

SHA256Managed sha = new SHA256Managed();
byte[] imgHash1 = sha.ComputeHash(imgBytes1);
byte[] imgHash2 = sha.ComputeHash(imgBytes2);

// compare the hashes
for (int i = 0; i < imgHash1.Length && i < imgHash2.Length; i++)
{
    //found a non-match, exit the loop
    if (!(imgHash1[i] == imgHash2[i]))
        return false;
}
return true;
于 2012-05-14T18:49:44.960 に答える