এটি অনেক দিন হয়ে গেছে, তবে তবুও আমি মনে করি শুভাকাঙ্ক্ষা এবং হাওর সম্পর্কে ব্যাখ্যা সহ এই প্রশ্নের সঠিক উত্তর দেওয়া এখনও প্রয়োজন। এখনও অবধি সর্বোত্তম উত্তরটি হ'ল এমএসডিএনকে নিরঙ্কুশভাবে উদ্ধৃত করে - নিজের নিয়ম তৈরি করার চেষ্টা করবেন না, এমএস ছেলেরা জানত তারা কী করছে।
তবে প্রথমে প্রথম বিষয়: প্রশ্নের উদ্ধৃত হিসাবে গাইডলাইনটি ভুল।
এখন হুঁশ - তাদের দুটি আছে
প্রথম কারণ : হ্যাশকোডটি যদি কোনও উপায়ে গণনা করা হয় তবে কোনও বস্তুর জীবদ্দশায় এটি পরিবর্তন হয় না, এমনকি যদি বস্তু নিজেই পরিবর্তিত হয় তবে এটি সমান-চুক্তিকে ভেঙে দেবে।
মনে রাখবেন: "যদি দুটি বস্তু সমান হিসাবে তুলনা করে তবে প্রতিটি বস্তুর জন্য গেটহ্যাশকোড পদ্ধতিটি অবশ্যই একই মানটি ফেরত দিতে হবে However তবে, দুটি বস্তু সমান হিসাবে তুলনা না করলে দুটি বস্তুর জন্য গেটহ্যাশকোড পদ্ধতিগুলিকে আলাদা মান দিতে হবে না" "
দ্বিতীয় বাক্যটি প্রায়শই ভুল ব্যাখ্যা করা হয় "একমাত্র নিয়ম হ'ল, বস্তু তৈরির সময় সমান বস্তুর হ্যাশকোড সমান হতে হবে"। কেন জানি না, তবে এটি এখানে বেশিরভাগ উত্তরের সারাংশ সম্পর্কেও।
একটি নাম সম্বলিত দুটি বস্তুর কথা ভাবেন, যেখানে নামটি সমান পদ্ধতিতে ব্যবহৃত হয়: একই নাম -> একই জিনিস। উদাহরণ তৈরি করুন একটি: নাম = জো ইনস্ট্যান্স বি তৈরি করুন: নাম = পিটার
হ্যাশকোড এ এবং হ্যাশকোড বি সম্ভবত এক হবে না। এখন কী ঘটবে, যখন উদাহরণের বি নাম পরিবর্তন করে জো?
প্রশ্ন থেকে প্রাপ্ত গাইডলাইন অনুযায়ী, বি এর হ্যাশকোড পরিবর্তন হবে না। এর ফলাফলটি হবে: A.Equals (B) ==> সত্য তবে একই সাথে: এ.গেটহ্যাশকোড () == বি.গেটহ্যাশকোড () ==> মিথ্যা।
তবে ঠিক এই আচরণটি সমান এবং হ্যাশকোড-চুক্তি দ্বারা স্পষ্টভাবে নিষিদ্ধ।
দ্বিতীয় কারণ : যদিও এটি - অবশ্যই - সত্য, হ্যাশকোডের পরিবর্তনগুলি হ্যাশকোড ব্যবহার করে হ্যাশ তালিকা এবং অন্যান্য বস্তুগুলি ভেঙে ফেলতে পারে, বিপরীতটিও সত্য। হ্যাশকোড পরিবর্তন না করা সবচেয়ে খারাপ ক্ষেত্রে হ্যাশ তালিকাগুলি আসবে, যেখানে প্রচুর পরিমাণে বিভিন্ন অবজেক্টের একই হ্যাশকোড থাকবে এবং তার জন্য একই হ্যাশ বিনে থাকবে - উদাহরণস্বরূপ, যখন বস্তুগুলিকে স্ট্যান্ডার্ড মান দিয়ে আরম্ভ করা হয়।
ওয়েলস এখন আসছেন ভাল, প্রথম নজরে, একটি বৈপরীত্য বলে মনে হচ্ছে - যেভাবেই হোক, কোডটি ভেঙে যাবে। তবে কোনও সমস্যাই পরিবর্তিত বা অপরিবর্তিত হ্যাশকোড থেকে আসে না।
সমস্যার উত্সটি এমএসডিএন-তে ভালভাবে বর্ণনা করা হয়েছে:
এমএসডিএন এর হ্যাশটেবল এন্ট্রি থেকে:
মূল অবজেক্টগুলি যতক্ষণ না হ্যাশটেবলের কী হিসাবে ব্যবহৃত হয় সেগুলি অবশ্যই অপরিবর্তনীয় হতে হবে।
এর অর্থ এই:
যে কোনও বস্তু যা একটি হ্যাশভ্যালু তৈরি করে তার হ্যাশভ্যালু পরিবর্তন করা উচিত, যখন বস্তুটি পরিবর্তিত হয় তবে এটি অবশ্যই হবে না - একেবারে অবশ্যই করা উচিত নয় - যখন এটি হ্যাশটেবলের অভ্যন্তরে ব্যবহৃত হয় (বা অন্য কোনও হ্যাশ-ব্যবহারকারী বস্তু অবশ্যই) ।
প্রথমে সহজতম উপায়টি হ্যাশটবেলে কেবলমাত্র ব্যবহারের জন্য অপরিবর্তনীয় অবজেক্টগুলি ডিজাইন করা ছিল, এটি প্রয়োজনের সময় সাধারণ, পরিবর্তনীয় অবজেক্টগুলির অনুলিপি হিসাবে তৈরি করা হবে। অপরিবর্তনীয় বস্তুর অভ্যন্তরে, হ্যাশকোডকে ক্যাশে করা মানসিকভাবে ঠিক, কারণ এটি অপরিবর্তনীয় able
দ্বিতীয় কীভাবে বা অবজেক্টটিকে "আপনি এখন ধাবিত হয়ে গেছেন" - ফ্ল্যাগ করুন, নিশ্চিত করুন যে সমস্ত বস্তুর ডেটা ব্যক্তিগত আছে, সমস্ত ফাংশনে পতাকাটি পরীক্ষা করুন যা বস্তুর ডেটা পরিবর্তন করতে পারে এবং পরিবর্তনের অনুমতি না থাকলে একটি ব্যতিক্রম ডেটা ফেলে দিতে পারে (যেমন পতাকা সেট করা আছে) )। এখন, আপনি যখন কোনও হ্যাশড অঞ্চলে অবজেক্টটি রাখবেন তখন পতাকাটি সেট করার বিষয়টি নিশ্চিত করুন এবং - পাশাপাশি - পতাকাটি আনসেট করুন, যখন এটির আর প্রয়োজন নেই। ব্যবহারের সহজতার জন্য, আমি "গেটহ্যাশকোড" পদ্ধতির অভ্যন্তরে পতাকাটি স্বয়ংক্রিয়ভাবে সেট করার পরামর্শ দেব - এইভাবে এটি ভুলে যাওয়া যায় না। এবং "রিসেটহ্যাশফ্লেগ" পদ্ধতির স্পষ্ট কলটি নিশ্চিত করবে, প্রোগ্রামারটিকে ভাবতে হবে, তবে এখনই অবজেক্টের ডেটা পরিবর্তন করার অনুমতি নেই বা দেওয়া হচ্ছে না।
ঠিক আছে, পাশাপাশি কী বলা উচিত: এমন কিছু ক্ষেত্রে রয়েছে, যেখানে মিউটেবল ডেটা সহ অবজেক্ট থাকা সম্ভব হয়, যেখানে হ্যাশকোড তবুও অপরিবর্তিত থাকে যখন বস্তুর ডেটা পরিবর্তন করা হয়, সমান ও হ্যাশকোড-চুক্তি লঙ্ঘন না করে।
তবে এটির প্রয়োজন নেই যে সমান-পদ্ধতিটিও পার্শ্ববর্তী ডেটার উপর ভিত্তি করে নয়। সুতরাং, যদি আমি কোনও বস্তু লিখি এবং একটি গেটহ্যাশকোড পদ্ধতি তৈরি করি যা একবারে একবারে একটি মান গণনা করে এবং পরে কলগুলিতে এটি ফেরত দেওয়ার জন্য বস্তুর অভ্যন্তরে সঞ্চয় করে, তবে অবশ্যই আমাকে আবার অবশ্যই করতে হবে: অবশ্যই, অবশ্যই একটি সমান পদ্ধতি তৈরি করতে হবে, যা ব্যবহার করবে তুলনার জন্য সঞ্চিত মানগুলি, যাতে A.Equals (B) কখনই মিথ্যা থেকে সত্যে পরিবর্তিত হয় না। অন্যথায়, চুক্তি ভঙ্গ হবে। এর ফলাফল সাধারণত হবে যে সমান পদ্ধতিটি কোনও অর্থবোধ করে না - এটি মূল রেফারেন্স সমান নয়, তবে এটি কোনও মানও সমান নয়। কখনও কখনও, এটি উদ্দেশ্যমূলক আচরণ হতে পারে (যেমন গ্রাহক রেকর্ডস), তবে সাধারণত তা হয় না।
সুতরাং, কেবলমাত্র গেটহ্যাশকোডের ফলাফল পরিবর্তন করুন, যখন অবজেক্টের ডেটা পরিবর্তন হয় এবং যদি হ্যাশের অভ্যন্তরের অবজেক্টের তালিকা বা বস্তু ব্যবহার করে উদ্দেশ্য হয় (বা কেবল সম্ভব) তবে অবজেক্টটিকে হয় অপরিবর্তনীয় করে তুলুন বা এর জন্য ব্যবহারের জন্য কেবলমাত্র পঠিত পতাকা তৈরি করুন অবজেক্টযুক্ত একটি হ্যাশ তালিকার জীবনকাল।
(উপায়ে: এগুলি সমস্ত সি # ওডার নয়। নেট নির্দিষ্ট - এটি সমস্ত হ্যাশটেবল প্রয়োগের প্রকৃতিতে বা অন্য যে কোনও সূচকযুক্ত তালিকার বেশি সাধারণত যে বস্তুর তালিকায় থাকা ডেটা কখনই পরিবর্তন করা উচিত নয়) "অপ্রত্যাশিত এবং অপ্রত্যাশিত আচরণ ঘটবে, যদি এই নিয়মটি ভেঙে যায় Some কোথাও, তালিকা প্রয়োগ করা যেতে পারে, যা তালিকার অভ্যন্তরে সমস্ত উপাদান নিরীক্ষণ করে এবং তালিকাকে স্বয়ংক্রিয়ভাবে পুনর্নির্মাণ করতে পারে - তবে সেগুলির কার্য সম্পাদন অবশ্যই সর্বোপরি মারাত্মক হবে)"