“আচ্ছা বল তো: একটা নিয়ম আছে যে, equals মেথড ওভাররাইড করলেই সাধারনত* hashCode মেথডও ওভাররাইড করতে হয় - এটা কেন?”


(মার্চ ৪, বুধবার, ২০১৫)

Sabre (উচ্চারণ যদিও সেবার) বেশ নাম করা কোম্পানি। ওরা খুব গর্ব করে প্রায়-ই বলে যে আমরা ওদের নাম না শুনলেও ওদের সফটওয়্যার নাকি (যদি একবারের জন্যও  প্লেনে করে কোথাও গিয়ে থাকি) -  আমরা ব্যবহার করেছি-ই।  সম্ভবত কথাটা ঠিকই। এয়ারলাইন ইন্ডাস্ট্রি’র মোটামুটি একচেটিয়া ব্যবসা এই কোম্পানির। ফ্লাইট শিডিউল (আমরিকাতে যদিও এরা স্কেজিউল উচ্চারণ করে!) করার সফটওয়্যার এদের। আর প্রায় সব এয়ারলাইন কোম্পানি এদের ক্লায়েন্ট। আমরিকাতে বেশ নাম করা Travelocity ওয়েবসাইট  আর এখনকার বেশ জনপ্রিয় ট্রাভেল মোবাইল আপ TripCase এদেরই।

এদের হেডকোয়ার্টার টেক্সাস-এর সাউথলেক শহরে। ডালাস শহর থেকে প্রায় ৪০ মিনিটের ড্রাইভ। আমার গ্রাজুয়েশন’র ঠিক আগে আগে তখন আমি জোরেশোরে চাকরি খুঁজছি। আমার টার্গেট টেক্সাস-এই কিছু একটা পাওয়া।  দীপ ভাই নামের এক বড় ভাই Sabre -এ কাজ করেন, আর তাঁর রেফারেন্স-এই আমি সেখানে ইন্টারভিউ-র ডাক পাই।  

ইন্টারভিউ-র সব প্রশ্ন মনে না থাকলেও, এই একটা প্রশ্ন খুব ভালো করে মনে আছে।  কারণ, উত্তরটা আমি দিতে পারি নাই।  ওরা অনেক হিন্টস দিয়ে সাহায্য করতে চেষ্টা করলেও আমি কোনভাবেই পারি নাই!

প্রথম প্রশ্ন ছিল: কখন আমাদের কোনো class -এর equals মেথড ওভাররাইড করতে হবে? এটার উত্তর আমি কোনো ভাবে দিয়ে ছিলাম। এই মুহুর্তে  আপনার জানা না থাকলে এর উত্তর আমার আগের ব্লগ পোস্টে আছে, পড়ে নিতে পারেন।  এর পরের প্রশ্ন, (যেটা আমি পারি নাই) - ছিল এই রকম:

“আচ্ছা বল তো: একটা নিয়ম আছে যে, equals মেথড ওভাররাইড করলেই সাধারনত* hashCode মেথডও ওভাররাইড করতে হয় - এটা কেন?”

আমি অনেক চেষ্টা করেও বলতে পারি নাই।  আমার মাথাও কাজ করছিল না। আসলে ব্যাপারটা কিন্তু ততোটা জটিল কিছু না।  

equals মেথড ওভাররাইড করে আমরা দুটো অবজেক্টের ইকুয়ালিটি (অর্থাৎ একই কীনা) তা ঠিক করি।  অবজেক্ট-এর স্টেট  বা এট্রিবিউট গুলোর মানের উপর ভিত্তি করে আমরা চাই আমাদের মত করে ইকুয়ালিটির সজ্ঞা ঠিক করতে।

অন্য দিকে hashCode একটা অবজেক্ট-এর জন্য ইন্টিজার হ্যাশ ভ্যালু রিটার্ন করে।  আমরা যখন equals মেথড ওভাররাইড করে ইকুয়ালিটির সজ্ঞা বদলাচ্ছি, অর্থাৎ অবজেক্ট-এর মানের উপর ভিত্তি করে দুটো অবজেক্টকে একই বলছি, hashCode মেথড কিন্তু তখনও সেই দুটো (একই) অবজেক্টের জন্য ভিন্ন ভিন্ন হ্যাশ ভ্যালু রিটার্ন করছে।

হ্যাশ ব্যবহার করে এমন যেকোনো ডাটা স্ট্রাকচার -এর জন্য এটা একটা ভয়ঙ্কর একটা ব্যাপার।

ভেবে দেখুন: আপনি হয়তো HashMap -এ একটা অবজেক্টকে কী (key ) হিসাবে রাখলেন, তারপর একই এট্রিবিউট মান আছে (অর্থাৎ আমাদের সজ্ঞা অনুযায়ী একই অবজেক্ট) - এমন অবজেক্ট ব্যবহার করে containsKey(Object key)  মেথড কল করলেন - আপনি জানতে চান, এই অবজেক্ট hashMap -এ আছে কীনা। আপনার আশা ভুল প্রমান করে  এই কল কিন্তু false  রিটার্ন করবে !!

hashCode -এর শর্তই হচ্ছে: একটা রানিং প্রসেস -এ একই অবজেক্ট সব সময়ই একই হ্যাশ মান দেবে।  

আমরা যদি equals মেথড ওভাররাইড করে, ইকুয়ালিটির সজ্ঞা বদলিয়ে আপাত দৃষ্টিতে ভিন্ন দুটো অবজেক্টকে একই বলি, তবে তারাও এই শর্তের বাইরে যাবে না।  তাদেরকেও একই হ্যাশ মান রিটার্ন করতে হবে।  

আর এই কারণেই নিয়ম হচ্ছে : “equals মেথড ওভাররাইড করলেই সাধারনত* hashCode মেথডও ওভাররাইড করতে হয়

আচ্ছা, কিন্তু কীভাবে hashCode ওভাররাইড করতে হবে?

জশুয়া ব্লক-এর Effective Java বইয়ের ৮ নম্বর আইটে-এ খুব ভালো করে এটা ব্যাক্ষা করা আছে। একটু জটিলই। মূলত যেটা বলা আছে তা হচ্ছে, আমরা equals  মেথডে যেই সব এট্রিবিউট ব্যবহার করে ইকুয়ালিটি ঠিক করেছি, সেই সব এট্রিবিউট গুলোই ব্যবহার করে (রিকার্সিভলী) প্রতিটি অবজেক্টের হ্যাশ ভ্যালু হিসেব করতে হবে।  

সুখবর হচ্ছে আমাদের সাহায্য করার জন্য এক্সপার্ট প্রোগ্রামাররা hashCode হিসাব করার জন্য লাইব্রেরি তৈরী করে রেখেছেন। আমাদের সেটা ব্যবহার করলেই হলো।  

ধন্যবাদ।
-- ইশতিয়াক

পুনশ্চ: Sabre -এ আমার চাকরিটা শেষমেশ আর হয় নাই। না হওয়ার কারণটাও মজার। এই প্রশ্ন না পারলেও বাকি ইন্টারভিউ আমার ভালই হয়েছিল। রিক্রুটার আমাকে আশা দিয়ে ইমেইল দিয়েছিল। সব রেকমেন্ডেশন লেটার জমা  নিয়ে ওরা আমাকে ২-৩ সপ্তাহের মধ্যেই কল করবে বলেছিল। কিন্তু পরে ‘Thank you for your interest “-ইমেইল পেয়েছিলাম। দীপ ভাইয়ের কাছে জেনেছিলাম ওদের CEO বদলে যাওয়ায় ওরা নাকি  Hiring freeze করে দিয়েছিল। যাই হোক, পরে আরেক বড় ভাই, রাকিব ভাইয়ের সাহায্যে এখনকার চাকরীটা (বাসার আরো কাছেই) পেয়েছি। আসল কথা হচ্ছে, বড় ভাইস rock !!

* আমাদের ব্যাচের বিপুলকে ধন্যবাদ ভুলটা ধরিয়ে দেয়ার জন্য। hashCode ওভাররাইড করতেই হবে কথাটা ঠিক না। আমাদের কোড যদি হ্যাশ ভিত্তিক কোনো ডাটা স্ট্রাকচার (যেমন, hashMap, hashSet, hashTable) ব্যবহার না করে, তাহলে hashCode ওভাররাইড না করলেও চলবে। কিন্তু করে রাখা ভালো, কারণ ভবিষ্যতে যদি আমরা কখনো করি, তাহলে কোডে বাগ (bug) থেকে যাবে। জশুয়া ব্লক’র কথায় “Item 8: Always override hashCode when you override equals”.

No comments:

Post a Comment

কাজের জায়গায় ভুল থেকে শেখা: regex 'র একটা খুব কমন বিষয় যেটা এতদিন ভুল জানতাম

কাজের জায়গায় ভুল থেকে শেখা: regex 'র একটা খুব কমন বিষয় যেটা এতদিন ভুল জানতাম  ৩ ফেব্রুয়ারি, শনিবার, ২০২৪ রেগুলার এক্সপ্রেশন (Regular Exp...