হ্যাশ ফাংশন সম্পর্কিত উইকিপিডিয়া নিবন্ধটি খুব ভাল, তবে আমি এখানে আমার গ্রহণ করব।
হ্যাশ কি?
"হ্যাশ" সত্যই বিভিন্ন প্রসঙ্গে বিভিন্ন প্রথাগত অর্থ সহ একটি বিস্তৃত শব্দ। আপনার প্রশ্নের একক নিখুঁত উত্তর নেই। আমি সাধারণ অন্তর্নিহিত ধারণাটি ব্যাখ্যা করব এবং শব্দটির বেশ কয়েকটি সাধারণ ব্যবহারের উল্লেখ করব।
একটি "হ্যাশ" হ্যাশ ফাংশন হিসাবে পরিচিত এমন একটি ফাংশন
যা ইনপুট অবজেক্ট হিসাবে গ্রহণ করে এবং স্ট্রিং বা সংখ্যার আউটপুট দেয়। ইনপুট অবজেক্টগুলি সাধারণত স্ট্রিং, পূর্ণসংখ্যা বা ব্যবহারকারী সংজ্ঞায়িত স্ট্রাকচারের মতো অন্যান্য অবজেক্টের সমন্বয়ে থাকা বড় আকারের ডেটা জাতীয় ধরণের সদস্য হয়। আউটপুটটি সাধারণত একটি সংখ্যা বা একটি স্ট্রিং। বিশেষ্য "হ্যাশ" প্রায়শই এই আউটপুটকে বোঝায়। "হ্যাশ" ক্রিয়াপদের অর্থ প্রায়শই "হ্যাশ ফাংশন প্রয়োগ করুন"। হ্যাশ ফাংশনটির প্রধান বৈশিষ্ট্যগুলি হ'ল:h
- এটি গণনা করা সহজ এবং
- আউটপুটগুলি তুলনামূলকভাবে ছোট হওয়া উচিত।
উদাহরণ:
বলুন আমরা 0 থেকে 999,999,999 থেকে শুরু করে 0 এবং 99 এর মধ্যে নম্বরগুলিতে হ্যাশ করতে চাই One একটি সাধারণ হ্যাশ ফাংশন ।h(x)=xmod100
সাধারণ অতিরিক্ত বৈশিষ্ট্য:
ব্যবহারের ক্ষেত্রে উপর নির্ভর করে আমরা হ্যাশ ফাংশনটি অতিরিক্ত সম্পত্তি সন্তুষ্ট করতে চাই want এখানে কিছু সাধারণ অতিরিক্ত বৈশিষ্ট্য রয়েছে:
অভিন্নতা : প্রায়শই আমরা চাই বস্তুর হ্যাশগুলি আলাদা হোক। তবুও আমরা হ্যাশগুলি "স্প্রেড-আউট" হতে চাই। যদি আমি কিছু বস্তুকে 100 বালতিতে হ্যাশ করতে চাই (তবে আমার হ্যাশ ফাংশনের আউটপুট 0-99 থেকে একটি সংখ্যা), তবে আমি সাধারণত আশা করি যে প্রায় 1/100 অবজেক্ট বালতি 0 তে অবতরণ করছে, প্রায় 1/100 জমি বালতি 1, এবং আরও।
ক্রিপ্টোগ্রাফিক সংঘর্ষ প্রতিরোধ : কখনও কখনও এটি আরও দূরে নেওয়া হয়, উদাহরণস্বরূপ, ক্রিপ্টোগ্রাফিতে আমি একটি হ্যাশ ফাংশন চাইতে পারি যে কোনও প্রতিপক্ষের পক্ষে একই আউটপুটে সেই মানচিত্রের দুটি পৃথক ইনপুট সন্ধান করা গণনাগতভাবে কঠিন।
সংক্ষিপ্তসার : আমি প্রায়শই স্থির আকারের আউটপুট বা স্থির সংখ্যক বালতিতে নির্বিচারে-বড় ইনপুটগুলি হ্যাশ করতে চাই।
নির্ধারণ : আমি একটি হ্যাশ ফাংশন চাইতে পারি যার আউটপুট রানের মধ্যে পরিবর্তিত হয় না, অর্থাৎ একই বস্তুর হ্যাশ ফাংশনের আউটপুট সর্বদা একই থাকে। এটি উপরের অভিন্নতার সাথে সাংঘর্ষিক বলে মনে হতে পারে তবে একটি সমাধান হ্যাশ ফাংশনটি এলোমেলোভাবে একবার বেছে নেওয়া এবং এটির রানগুলির মধ্যে পরিবর্তন না করা।
কিছু অ্যাপ্লিকেশন
একটি সাধারণ অ্যাপ্লিকেশন হ্যাশ টেবিলের মতো ডেটা স্ট্রাকচারে রয়েছে যা অভিধান প্রয়োগ করার উপায়। এখানে, আপনি কিছু স্মৃতি বরাদ্দ করেছেন, বলুন, 100 "বালতি"; তারপরে, অভিধানে একটি (কী, মান) জুটি সংরক্ষণ করার জন্য জিজ্ঞাসা করা হলে, আপনি কীটি 0-99 নম্বরে হ্যাশ করুন এবং জোড়াটি স্মৃতিতে সংশ্লিষ্ট বালতিতে সংরক্ষণ করুন। তারপরে, যখন আপনাকে কোনও কী সন্ধান করতে বলা হবে, আপনি একই হ্যাশ ফাংশন সহ 0-99 নম্বরে কীটি হ্যাশ করুন এবং সেই কীটি সেখানে আছে কিনা তা দেখতে সেই বালতিটি পরীক্ষা করে দেখুন। যদি তা হয় তবে আপনি এর মানটি ফিরিয়ে দিন।
নোট করুন যে আপনি অন্যান্য উপায়ে অভিধান প্রয়োগ করতে পারেন যেমন বাইনারি অনুসন্ধান গাছের সাথে (যদি আপনার বিষয়গুলির তুলনা করা যায়)।
আর একটি ব্যবহারিক অ্যাপ্লিকেশন হ'ল চেকস্মস, যা দুটি ফাইল একই রয়েছে তা পরীক্ষা করার উপায় (উদাহরণস্বরূপ, ফাইলটি আগের সংস্করণ থেকে দূষিত হয়নি)। হ্যাশ ফাংশনগুলি একই আউটপুটে দুটি ইনপুট মানচিত্রের পক্ষে খুব কম সম্ভাবনা রয়েছে বলে আপনি প্রথম ফাইলটির একটি হ্যাশ গণনা করে সংরক্ষণ করেন যা সাধারণত স্ট্রিং হিসাবে উপস্থাপিত হয়। এই হ্যাশটি খুব ছোট, সম্ভবত কয়েক ডজন ASCII অক্ষর রয়েছে। তারপরে, আপনি যখন দ্বিতীয় ফাইলটি পাবেন, আপনি এটি হ্যাশ করে দেখুন এবং আউটপুটটি একই। যদি তা হয় তবে প্রায় অবশ্যই এটি বাইট-বাই বাইট একই ফাইল।
আর একটি অ্যাপ্লিকেশন ক্রিপ্টোগ্রাফিতে রয়েছে, যেখানে এই হ্যাশগুলি "ইনভার্ট" করা শক্ত হওয়া উচিত - অর্থাৎ আউটপুট এবং হ্যাশ ফাংশনটি দেওয়া হলে, আউটপুটটির কারণ হিসাবে চিহ্নিত ইনপুট (গুলি) বের করা গণনাগতভাবে শক্ত হওয়া উচিত। এর একটি ব্যবহার পাসওয়ার্ডগুলির জন্য: পাসওয়ার্ডটি নিজেই সংরক্ষণ করার পরিবর্তে আপনি পাসওয়ার্ডের একটি ক্রিপ্টোগ্রাফিক হ্যাশ সংরক্ষণ করেন (সম্ভবত কিছু অন্যান্য উপাদান সহ)। তারপরে, যখন কোনও ব্যবহারকারী কোনও পাসওয়ার্ড প্রবেশ করে, আপনি তার হ্যাশ গণনা করুন এবং পরীক্ষা করুন যে এটি সঠিক হ্যাশের সাথে মেলে; যদি তা হয় তবে আপনি বলবেন যে পাসওয়ার্ডটি সঠিক। (এখন এমনকি যে কেউ সার্ভারে সংরক্ষিত হ্যাশটি সন্ধান করতে ও সন্ধান করতে পারে তার ব্যবহারকারীর ভান করার এত সহজ সময় আর পাওয়া যায় না)) এই অ্যাপ্লিকেশন এমন একটি ক্ষেত্রে হতে পারে যেখানে আউটপুট ইনপুট থেকে ঠিক দীর্ঘ বা দীর্ঘতর হয়, যেহেতু ইনপুটটি এত ছোট।