C# إنشاء التجزئة على صفيف بايت أو صورة [مكررة]

StackOverflow https://stackoverflow.com/questions/800463

  •  03-07-2019
  •  | 
  •  

سؤال

ممكن مكررة:
كيف يمكنني إنشاء hashcode من صفيف بايت في c#

في C#, أنا بحاجة إلى إنشاء تجزئة صورة للتأكد من أنها فريدة من نوعها في التخزين.

أنا يمكن بسهولة تحويلها إلى صفيف بايت ولكن غير متأكد من كيفية المضي قدما من هناك.

هل هناك أي دروس في .NET framework التي يمكن أن تساعد لي ، أو أي علم من بعض كفاءة خوارزميات لخلق فريدة من نوعها الحشيش ؟

هل كانت مفيدة؟

المحلول

هناك الكثير من hashsum مقدمي الخدمة في .صافي الذي خلق تجزئات التشفير التي satisifies حالتك التي هي فريدة من نوعها (بالنسبة لمعظم الأغراض الاصطدام واقية).لأنها جميعا للغاية سريع و تجزئة بالتأكيد لن يكون عنق الزجاجة في التطبيق الخاص بك إلا إذا كنت تفعل ذلك تريليون مرات.

شخصيا أحب SHA1:

string hash;
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
    hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}

حتى عندما يقول الناس طريقة واحدة قد تكون أبطأ من آخر ، كل شيء نسبي.برنامج التعامل مع الصور بالتأكيد لن تلاحظ ميكروثانية عملية توليد hashsum.

و فيما يتعلق التصادم ، بالنسبة لمعظم أغراض هذا هو أيضا غير ذي صلة.حتى "عفا عليها الزمن" أساليب مثل MD5 لا تزال مفيدة للغاية في معظم الحالات.نوصي فقط لا تستخدم ذلك عند أمن النظام الخاص بك يعتمد على منع الاصطدامات.

نصائح أخرى

جزء من ريكس م رد حول استخدام SHA1 لتوليد تجزئة جيدة (MD5 هو أيضا خيارا شعبيا).zvolkov اقتراح حول عدم باستمرار خلق جديد التشفير مقدمي هو أيضا فكرة جيدة (كما هو اقتراح حول استخدام CRC إذا كانت السرعة هي أكثر أهمية من تقريبا-ضمان التفرد.

ومع ذلك ، لا لا استخدام ترميز.UTF8.GetString() لتحويل بايت[] إلى سلسلة (ما لم يكن بالطبع كنت تعرف من السياق أنه صالح UTF8).واحد ، وسوف رفض صالح surogates.طريقة مضمونة دائما تعطيك سلسلة صالحة من byte[] هو تحويل.ToBase64String().

إنشاء مثيل جديد من SHA1CryptoServiceProvider في كل مرة تحتاج إلى حساب تجزئة ليست سريعة في كل شيء.باستخدام نفس المثال هو سريع جدا.

ما زلت أفضل أن تفعل واحدة من العديد من حقوق الطفل خوارزميات بدلا من تجزئة التشفير كما تجزئة المهام مصممة التشفير لا يعمل جيدا جدا بالنسبة صغيرة جدا تجزئة الأحجام (32 بت) وهو ما تريد الخاص بك GetHash() تجاوز (على افتراض أن ما تريد).

التحقق من هذا الارتباط بها على سبيل المثال واحد من الحوسبة حقوق الطفل في C#: http://sanity-free.org/134/standard_crc_16_in_csharp.html

P. S.السبب تريد التجزئة الخاصة بك أن تكون صغيرة (16 أو 32 بت) بحيث يمكن مقارنتها بسرعة (هذا هو الهدف من وجود التجزئة ، تذكر؟).بعد تجزئة يمثله 256 بت طويلة قيمة ترميز سلسلة مجنون جدا من حيث الأداء.

يمكنك استخدام أي من معيار خوارزميات التجزئة ، ولكن التجزئة لا يمكن من الناحية الفنية ضمان التفرد.تجزئة هو صمم ليكون سريع نسبيا و/أو صغيرة أن تكون قادرة على معرفة ما إذا قطعة واحدة من البيانات المرجح هو نفس أخرى.فمن الممكن تماما بالنسبة كليا مجموعات مختلفة من البيانات لإنتاج نفس التجزئة ، على الرغم من كونها قادرة على إنتاج هذه حسابيا من الصعب جدا.

كل ذلك جانبا ، من أجل التحقق من المرجح الهوية ، MD5 هو سريع إلى حد ما.شاء هو أكثر موثوقية (MD5 قد اخترق ، لذلك لا يجب أن يكون استخدام الأمن) ، لكنه أيضا أبطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top