هل تتطلع إلى معرفة المزيد عن التجزئة في التشفير؟ إذا قمت بذلك ، فقد أتيت إلى المكان الصحيح.
في هذه المقالة ، سوف نستكشف المزيد عن التجزئة.
التجزئة هي تقنية في علوم الكمبيوتر لتحديد الأشياء أو القيم من مجموعة من الكائنات أو القيم.
يبدو محيرا?
دعونا نحاول أن نفهم بالقدوة.
حسنًا ، توفر الكليات والمدارس رقمًا مخصصًا فريدًا لكل طالب من طلابها. هذا الرقم الفريد هو ما يحدد هوية الطالب والمعلومات المتعلقة به. الطريقة المستخدمة لإنشاء الرقم الفريد هي التجزئة.
مثال آخر شائع هو المكتبات حيث ستجد الكثير من الكتب على الرفوف. كل كتاب هناك له رقم تعريف فريد خاص به بحيث يمكن وضعه في المكتبة الضخمة!
من الأمثلة الحديثة على التجزئة لاعبو اللعبة الذين يسجلون في اللعبة. Valorant هي لعبة مجانية أطلقتها شركة Riot. كونك مجانيًا للعب يعني أن ملايين الأشخاص سيلعبون اللعبة.
يتم تحديد كل لاعب باستخدام قيمة تعريف فريدة تم إنشاؤها باستخدام خوارزمية التجزئة.
دعونا نحاول فهمها بمزيد من التفصيل أدناه.
ما هو التجزئة?
كما هو مذكور أعلاه ، فإن التجزئة هي طريقة تحديد كائن من مجموعة.
يحصل كل كائن على رقم تعريف فريد بمجرد تجزئته.
ولكن ، ماذا يعني ذلك من الناحية الفنية?
من الناحية الفنية ، تولد الدالة الرياضية ناتجًا بطول ثابت من أي سلسلة إدخال بأي طول.
يتم تجزئة معاملات البيتكوين حيث تحصل المعاملات على معرفات فريدة.
إذا أدخلت “Hello، World!” في خوارزمية التجزئة SHA-256, سوف تحصل على الناتج التالي:
إدخال: مرحبا بالعالم!
انتاج: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
هنا يقوم SHA256 بإنشاء الإخراج من الإدخال المحدد. كما ترى ، استخدمنا خوارزمية التجزئة الآمنة (SHA-256). إنها إحدى طرق التجزئة الشائعة ، بما في ذلك Message Direct (MD5) و Secure Hash Function (SHA1).
الخصائص الرئيسية لوظيفة التجزئة تجعلها موثوقة. دعونا نسردها أدناه.
- حتمية → هذا يعني أن الناتج سيكون هو نفسه بالنسبة للإدخال المعطى في أي ظروف معينة.
- مقاومة Preimage ← تضمن ميزة مقاومة الصورة المسبقة أن قيمة التجزئة ليست مفيدة لتوليد قيمة الإدخال.
- كفاءة حسابية → تتسم وظائف التجزئة بالكفاءة ولا تتطلب موارد حسابية ضخمة لتنفيذها.
- لا يمكن عكس هندستها ← لا يمكن عكس وظيفة التجزئة هندسيًا.
- مقاومة الاصطدام ← تضمن مقاومة الاصطدام عدم وجود مدخلين يؤديان إلى نفس الإخراج.
لقد قمنا بالفعل بتغطية تجزئة التشفير للمبتدئين هنا. تحقق من ذلك هناك: تجزئة التشفير: دليل المبتدئين.
ولكن ، إذا كنت هنا من أجل الأشياء المتقدمة ، فلن تشعر بخيبة أمل.
ما هي وظيفة التجزئة وجداول التجزئة؟ وكيف تعمل?
في هذا القسم ، سوف نستكشف وظيفة التجزئة وجداول التجزئة بمزيد من التفصيل. من حيث التجزئة ، هناك وظائف التجزئة. هذه الوظائف مسؤولة عن تحويل المدخلات الكبيرة إلى مدخلات ثابتة صغيرة. تخزن جداول التجزئة المخرجات.
في عملية التجزئة ، يتم توزيع الكائنات بناءً على أزواج المفتاح / القيمة الخاصة بهم إلى المصفوفة. لذلك ، إذا قمت بتمرير مجموعة من العناصر إلى وظائف التجزئة ، فستحصل على ناتج مصفوفة حيث يكون لكل عنصر الآن مفتاح مرفق به. يعتبر زوج المفتاح / القيمة مفيدًا جدًا عندما يتعلق الأمر بالوصول إلى العناصر في الوقت الفعلي لأنه يوفر وقت O (1) مثير للإعجاب.
لتنفيذ وظائف التجزئة ، يمكنك إزالة الطريقتين المفضلتين.
- الطريقة الأولى هي استخدام دالة تجزئة لتحويل عنصر إلى عدد صحيح. بعد ذلك ، يمكن استخدام ناتج العدد الصحيح للوصول إلى العنصر عند وضع جدول التجزئة.
- خطوة أخرى هي وضع العنصر في جدول التجزئة ثم استعادته باستخدام المفتاح المجزأ.
في الطريقة الثانية ، ستكون الوظائف على النحو التالي:
hash = hash_function (key) الفهرس = التجزئة٪ array_size
هنا ، تكون التجزئة وأحجام الصفيف مستقلة عن بعضها البعض. يتم حساب قيمة الفهرس بناءً على حجم الصفيف. عامل تشغيل Modulo (٪) يمكننا من حساب القيمة.
بعبارات بسيطة ، يمكن تعريف دالة التجزئة على أنها وظيفة يمكنها تعيين بيانات الحجم التعسفي لمجموعة بيانات ذات حجم ثابت. يمكن تخزين مجموعة البيانات الناتجة ذات الحجم الثابت في جدول التجزئة. يتم إعطاء العديد من الأسماء للقيم التي يتم إرجاعها بواسطة دالة التجزئة. يمكن تسميتها قيم التجزئة ، والتجزئة ، ومجموع التجزئة ، ورموز التجزئة.
كتابة دالة تجزئة جيدة
إذا كنت ترغب في إنشاء وظيفة أو آلية تجزئة جيدة ، فأنت بحاجة إلى فهم المتطلبات الأساسية لإنشاء واحدة. دعونا نذكرها أدناه:
- يجب أن تكون وظيفة التجزئة سهلة الحساب. هذا يعني أنه لا ينبغي أن يتطلب تنفيذ العديد من الموارد.
- يجب توزيع دالة التجزئة بشكل موحد. من خلال القيام بذلك ، يتم استخدام جداول التجزئة لتخزين قيم التجزئة بحيث لا يحدث التجميع.
- الشرط الأخير هو أن يكون هناك تصادم أقل أو معدوم على الإطلاق. يعني عدم وجود تضارب أنه لم يتم تعيين مخرج واحد لمدخلين.
من الناحية الفنية ، تعد الاصطدامات جزءًا من دالة التجزئة ، ولا يمكن إزالتها ببساطة من وظيفة التجزئة. الهدف هو إنشاء دالة تجزئة يمكنها تقديم أداء جيد لجدول التجزئة وحل الاصطدام من خلال تقنيات دقة التصادم.
لماذا نحتاج إلى وظيفة تجزئة جيدة?
لفهم الحاجة إلى دالة تجزئة مفيدة ، دعنا نلقي نظرة على المثال أدناه.
لنفترض أننا نريد إنشاء جدول تجزئة باستخدام أسلوب تجزئة حيث ستكون سلاسل الإدخال على النحو التالي ، {“agk” ، “kag” ، “gak” ، “akg” ، “kga” ، “gka”}
الآن ، نقوم بإنشاء دالة تجزئة تضيف ببساطة قيمة ASCII لـ (97) ، و g (103) ، و k (107) ثم تقوم بعمل نموذج للمجموع بمقدار 307.
من الواضح أن مجموع الأرقام الثلاثة هو أيضًا 307. وهذا يعني أننا إذا بدّلنا جميع الأرقام ثم أجرينا عملية نمطية ، فسنحصل على نفس النتيجة. ستكون النتيجة النهائية هي تخزين جميع السلاسل في نفس رقم الفهرس. سيكون الوقت الحسابي لوظيفة التجزئة هو أيضًا تعقيد O (n) ، وهو أمر غير مرغوب فيه. يمكننا بسهولة أن نستنتج أن دالة التجزئة التي وصفناها ليست مثالية لسيناريوهات الحياة الواقعية.
لإصلاح دالة التجزئة ، يمكننا نشر قسمة مجموع قيم ASCII لكل عنصر على رقم أولي آخر ، 727. من خلال القيام بذلك ، سنحصل على مخرجات مختلفة لمصفوفة سلاسل الإدخال المحددة..
التعرف على جداول التجزئة
تعد جداول التجزئة مفيدة جدًا في تخزين نتيجة دالة التجزئة ، والتي تحسب الفهرس ثم تخزن قيمة مقابلها. ستكون النتيجة النهائية هي عملية حسابية أسرع مع تعقيد O (1).
تعد جداول التجزئة خيارًا جيدًا تقليديًا في حل المشكلات التي تتطلب وقت O (n).
لذلك ، إذا التقطت سلسلة ذات طول ثابت ثم حاولت معرفة تردد حرف السلسلة.
لذلك ، إذا كانت السلسلة = “aacddce” ، فإن الطريقة العامة هي المرور عبر السلسلة عدة مرات وتخزين كل تردد.
# قم بتوفير سلسلة إدخال ، واحسب تكرار الأحرف في تلك السلسلة
# الخوارزمية هي 0 (ن) وقت التعقيد
temp_list = [] بدء = "أ" str = "أبابكدديفف" def alpha_zeta (): alpha = ‘a’ لـ i في النطاق (0،26): temp_list.append (alpha) alpha = chr (ord (alpha) + 1) إرجاع temp_list temp_list = alpha_zeta () #print (temp_list) def character_frequency (str، temp_list): لكل في temp_list: freq = 0 لـ i في str: if (i == each): freq = freq + 1 print (each، freq) character_frequency (str، temp_list)
سيكون إخراج البرنامج أعلاه على النحو التالي:
أ 2 ب 2 ج 1 د 2 هـ 1 و 3 جم 0 ساعة 0 ط 0 .. ..
الآن ، دعنا ننفذ جدول تجزئة في C ++ ونحسب تكرار الأحرف.
# تضمين استخدام مساحة الاسم الأمراض المنقولة جنسيا ؛ تردد int [26] ؛ int hashFunc (char c) {return (c – ‘a’)؛ } void countFre (string S) {for (int i = 0؛ i< الطول () ؛ ++ i) {int index = hashFunc (S [i]) ؛ التردد [الفهرس] ++؛ } لـ (int i = 0 ؛ i<26 ؛ ++ i) {cout << (شار) (أنا + “أ”) << ” << التردد [i]<< نهاية. }} int main () {cout<<"مرحبا بالعالم"؛ countFre ("abbaccbdd") ؛ }
سيكون مخرجات البرنامج على النحو التالي:
أ 2 ب 3 ج 2 د 2
إن تعقيد O (N) للخوارزمية يجعلها أسرع مقارنة بالنُهج الخطية الأخرى.
كيفية حل الاصطدامات
هناك طرق فريدة لحل التضاربات في وظائف التجزئة. إحدى الطرق الشائعة هي التسلسل المنفصل والذي يُعرف أيضًا باسم التجزئة المفتوحة. يتم تنفيذه بقائمة مرتبطة حيث يكون كل عنصر في السلسلة هو نفسه قائمة مرتبطة. يمكّن هذا الأسلوب من تخزين العناصر والتأكد من أن بعض العناصر ليست سوى جزء من القائمة المرتبطة المحددة ، مما يؤدي إلى حل التضارب. هذا يعني أنه لا يمكن أن يكون لقيمتي إدخال نفس قيمة تجزئة الإخراج.
استكشاف الهاش في بايثون
في هذا القسم ، سنلقي نظرة سريعة على التجزئة في بايثون. سبب اختيارنا بايثون هو أنها سهلة القراءة ويمكن لأي شخص استخدامها دون الكثير من المتاعب.
نظرًا لأن التجزئة هي وظيفة شائعة ، فقد تم تنفيذها بالفعل في مكتبة Python. باستخدام الوحدة النمطية ، يمكنك توفير كائن كمدخل له ثم إرجاع القيمة المجزأة.
صيغة طريقة التجزئة هي:
تجزئة (كائن)
كما ترى ، فإنه يأخذ معلمة واحدة ، وهي الكائن. يمكن أن يكون الكائن عددًا صحيحًا أو عددًا عائمًا أو سلسلة.
تعتمد القيمة المرجعة لطريقة التجزئة () على الإدخال. بالنسبة إلى عدد صحيح ، قد يُرجع نفس الرقم بينما سيكون الرقم العشري والسلسلة مختلفين.
دعونا نرى بعض الأمثلة أدناه.
عدد = 10 ديسي = 1.23556 str1 = "نيتيش" طباعة (تجزئة (عدد)) طباعة (تجزئة (ديسي)) طباعة (تجزئة (str1))
إخراج الكود أعلاه على النحو التالي:
ومع ذلك ، لا يمكن تطبيق التجزئة على جميع أنواع الكائنات. على سبيل المثال ، إذا كنت تتذكر أننا أنشأنا قائمة من الألف إلى الياء في برنامجنا الأول. إذا حاولنا تجزئتها ، فإن نافذة الإخراج ستمر عبر TypeError: unhashable type: “list”
لتطبيق التجزئة على قائمة الكائنات ، تحتاج إلى استخدام tuple.
أحرف العلة = (‘a’، ‘e’، ‘i’، ‘o’، ‘u’) طباعة (تجزئة (أحرف العلة)) الإخراج ⇒ -5678652950122127926
التجزئة في التشفير
التجزئة مفيدة للتشفير. تستخدم Bitcoin التجزئة لإنشاء وإدارة أشجار Merkle
أيضًا ، كان التجزئة جزءًا من التشفير لفترة طويلة. ومع ذلك ، فإن أفضل حالة استخدام للتجزئة هي تجزئة كلمات المرور وتخزينها.
أشجار ميركل
Merkle tree هي بنية بيانات مفيدة عندما يتعلق الأمر بالتحقق الآمن من البيانات في تجمع بيانات كبير. يستخدم كل من Bitcoin و Ethereum أشجار Merkle لحل العديد من الحواجز التكنولوجية عند تخزين البيانات والوصول إليها في شبكة مفتوحة.
لا داعي للقلق من أي شبكة مركزية بشأن تخزين البيانات والوصول إليها حيث يوجد مصدر واحد فقط للوصول إلى البيانات وتخزينها. ومع ذلك ، تتغير المعادلة عندما تكون هناك شبكة لامركزية حيث يجب الآن نسخ البيانات بين مئات الأقران المشاركين.
تحل أشجار Merkle المشكلة من خلال توفير طريقة موثوقة وفعالة لمشاركة البيانات والتحقق منها بين الأقران.
مثال شجرة ميركل
لكن ، لماذا نناقش أشجار Merkle هنا؟ تستخدم أشجار Merkle التجزئة كوظيفة أساسية لربط العقد وكتل البيانات المختلفة.
Merkle Trees عبارة عن شجرة مقلوبة يمكنها تلخيص مجموعة المعاملات بالكامل.
إذا كنت ترغب في معرفة المزيد عن أشجار Merkle وكيفية استخدامها للتجزئة في التشفير ، فراجع دليلنا المفصل: دليل إلى Merkle Trees. هناك ، ناقشنا كيفية تنفيذ أدوات أشجار Merkle في البيتكوين وحالات الاستخدام الأخرى.
عملية التعدين
تستفيد عملية التعدين أيضًا من التجزئة. عندما يتعلق الأمر بتعدين البيتكوين ، تتم إضافة كتلة جديدة إلى blockchain عندما يكون هناك طلب عليها.
يجب اتباع طريقة لإضافة الكتلة إلى blockchain. يتم إنشاء قيمة تجزئة بناءً على محتوى الكتلة عند وصول كتلة جديدة. أيضًا ، إذا كانت التجزئة التي تم إنشاؤها أكثر من صعوبة في الشبكة ، فستبدأ عملية إضافة الكتلة إلى blockchain.
بمجرد الانتهاء من ذلك ، يقر جميع الأقران في الشبكة بإضافة الكتلة الجديدة.
ولكن نادرًا ما يكون هذا هو الحال نظرًا لأن صعوبة الشبكة ، في معظم الحالات ، تكون دائمًا أعلى مقارنةً بالتجزئة المولدة. هناك جانب آخر يلعب دورًا حاسمًا في عملية التعدين. هذا هو nonce.
تتم إضافة nonce إلى تجزئة الكتلة وهي سلسلة عشوائية. بمجرد الانتهاء من ذلك ، تتم مقارنة السلسلة المتسلسلة بمستوى الصعوبة. إذا كان مستوى الصعوبة أقل من السلسلة المتسلسلة ، فسيتم تغيير قيمة nonce حتى يصبح مستوى الصعوبة أعلى.
يمكن تلخيص العملية في الخطوات التالية:
- يتم تجزئة المحتويات لإنشاء قيمة تجزئة جديدة كلما تم إنشاء كتلة جديدة أو أخذها,
- يتم إنشاء قيمة nonce جديدة وإلحاقها بالتجزئة
- تتم عملية التجزئة على سلسلة جهات الاتصال الجديدة
- ثم تتم مقارنة القيمة النهائية للتجزئة بمستوى صعوبة الشبكة
- إذا كانت قيمة التجزئة النهائية أقل من قيمة nonce ، يتم تكرار العملية مرة أخرى. تتوقف العملية فقط عندما تكون قيمة التجزئة أكبر من قيمة nonce.
- ينضم Block إلى السلسلة بمجرد أن يكون مستوى الصعوبة أعلى
- ثم يتحمل عمال المناجم مسؤولية تعدين الكتلة الجديدة ومشاركة المكافآت فيما بينهم.
يأتي مصطلح “معدل التجزئة” أيضًا من هنا. معدل التجزئة هو المعدل الذي تتم به عمليات التجزئة. يعني معدل التجزئة الأعلى أن المعدنين سيحتاجون إلى قوة حسابية أكبر للمشاركة في عملية التعدين.
استنتاج
هذا يقودنا إلى نهاية الدليل المتعمق للتجزئة في التشفير. لقد غطينا التجزئة بالتفصيل واستكشفنا أيضًا الكود وراءها.
أذا ماذا تعتقد في ذلك؟ التعليق أدناه، واسمحوا لنا أن نعرف.
#التعليمات
ما هو التجزئة في التشفير?
في التشفير ، تعد التجزئة طريقة لتحويل البيانات إلى سلسلة نصية فريدة باستخدام طريقة فعالة. أيضًا ، لا توجد قيود على نوع البيانات أو حجمها – تعمل التجزئة عليها جميعًا.
كيف يتم استخدام التجزئة في التشفير?
يستخدم التشفير التجزئة لتجزئة كلمات المرور أو إنشاء أرقام تعريف فريدة.