হ্যাশকোড কীসের জন্য ব্যবহৃত হয়? এটা কি অনন্য?


129

আমি লক্ষ্য করেছি যে getHashCode()ডাব্লুপি 7 এ প্রতিটি নিয়ন্ত্রণে, আইটেমগুলিতে একটি পদ্ধতি রয়েছে যা সংখ্যার ক্রম দেয়। আমি কি কোনও আইটেম সনাক্ত করতে এই হ্যাশকোডটি ব্যবহার করতে পারি? উদাহরণস্বরূপ আমি ডিভাইসে কোনও ছবি বা একটি গান সনাক্ত করতে এবং এটির কাছাকাছি যাচাই করতে চাই। নির্দিষ্ট আইটেমগুলির জন্য প্রদত্ত হ্যাশকোডটি স্বতন্ত্র হলে এটি করা যেতে পারে।

আপনি কি আমাকে হ্যাশকোড এবং কীসের getHashCode()জন্য ব্যবহার করছেন তা বোঝাতে সহায়তা করতে পারেন ?


আমি জানি হ্যাশকোড বলতে কী বোঝায়, আমি হ্যাশকোড পাওয়ার জন্য আমার কোডটি বহুবার চালানোর চেষ্টা করি এবং এটি একই সময়ে হ্যাশকোডকে একই সময়ে প্রতিলিপি হিসাবে ফেরত দেয় এবং এটির সদৃশ বলে মনে হয় না, তবে আমি খুব নিশ্চিত নই। ঠিক আছে, আপনি যদি ডাউনটি করতে চান তবে ঠিক আছে, এটি আপনার মতামত। যাইহোক সম্পাদনার জন্য ধন্যবাদ!
Nghia Nguyen

7
আমি এরিক লিপার্টের গাইডলাইন এবং গেটহ্যাশকোডের নিয়মগুলি পড়ার পরামর্শ দিচ্ছি , যদিও এটি হ্যাশকোডগুলি ব্যবহারের নিয়মের পরিবর্তে নিয়মগুলির উপর দৃষ্টি নিবদ্ধ করে ... কারণ তারা " কেবলমাত্র একটি জিনিসের জন্য ডিজাইনের দ্বারা কার্যকর : হ্যাশ টেবিলটিতে একটি বস্তু স্থাপন"
ব্রায়ান

উত্তর:


108

এমএসডিএন বলে :

একটি হ্যাশ কোড এমন একটি সাংখ্যিক মান যা সমতা পরীক্ষার সময় কোনও বিষয় সনাক্ত করতে ব্যবহৃত হয়। এটি কোনও সংগ্রহে কোনও সামগ্রীর সূচক হিসাবেও কাজ করতে পারে।

গেটহ্যাশকোড পদ্ধতি হ্যাশ টেবিলের মতো হ্যাশিং অ্যালগরিদম এবং ডেটা স্ট্রাকচারে ব্যবহারের জন্য উপযুক্ত।

গেটহ্যাশকোড পদ্ধতির ডিফল্ট বাস্তবায়ন বিভিন্ন বস্তুর জন্য অনন্য রিটার্ন মানগুলির গ্যারান্টি দেয় না। তদুপরি, .NET ফ্রেমওয়ার্কটি getHashCode পদ্ধতির ডিফল্ট প্রয়োগের গ্যারান্টি দেয় না এবং এটি যে মানটি দেয় তা .NET ফ্রেমওয়ার্কের বিভিন্ন সংস্করণের মধ্যে একই হবে। ফলস্বরূপ, এই পদ্ধতির ডিফল্ট প্রয়োগটি হ্যাশিংয়ের উদ্দেশ্যে কোনও অনন্য অবজেক্ট আইডেন্টিফায়ার হিসাবে ব্যবহার করা উচিত নয়।

গেটহ্যাশকোড পদ্ধতিটি একটি উত্পন্ন ধরণের মাধ্যমে ওভাররাইড করা যেতে পারে। এই ধরণের উপযুক্ত যে একটি হ্যাশ ফাংশন সরবরাহ করতে এবং হ্যাশ টেবিলটিতে একটি দরকারী বিতরণ সরবরাহ করতে মান ধরণেরগুলি অবশ্যই এই পদ্ধতিটিকে ওভাররাইড করতে হবে। স্বতন্ত্রতার জন্য, হ্যাশ কোডটি একটি স্থির ক্ষেত্র বা সম্পত্তির পরিবর্তে উদাহরণ ক্ষেত্র বা সম্পত্তির মানের ভিত্তিতে হওয়া উচিত।

হ্যাশটেবল অবজেক্টে কী হিসাবে ব্যবহৃত অবজেক্টগুলিকে গেটহ্যাশকোড পদ্ধতিটি ওভাররাইড করতে হবে কারণ those বস্তুগুলিকে অবশ্যই তাদের নিজস্ব হ্যাশ কোড উত্পন্ন করতে হবে। কী হিসাবে ব্যবহৃত কোনও বস্তু যদি getHashCode এর কার্যকর বাস্তবায়ন সরবরাহ না করে, আপনি যখন হ্যাশটেবল অবজেক্টটি তৈরি করা হয় তখন আপনি একটি হ্যাশ কোড সরবরাহকারী নির্দিষ্ট করতে পারেন। .NET ফ্রেমওয়ার্ক সংস্করণ 2.0 এর আগে, হ্যাশ কোড সরবরাহকারীর উপর ভিত্তি করে ছিল সিস্টেম.কলেশন.আইএইচসি কোডপ্রভাইডার ইন্টারফেস। সংস্করণ ২.০ দিয়ে শুরু করে, হ্যাশ কোড সরবরাহকারীর উপর ভিত্তি করে সিস্টেম.কলেকশনস.আইকুইলিটিকম্পিয়ার ইন্টারফেস।

মূলত, হ্যাশ টেবিলগুলি তৈরি করতে হ্যাশ কোডগুলি বিদ্যমান।
দুটি সমান বস্তুর সমান হ্যাশকোড থাকার গ্যারান্টিযুক্ত।
দুই অসম বস্তু না অসম hashcodes আছে (যে একটি সংঘর্ষের বলা হচ্ছে) নিশ্চিত।


3
এমএসডিএন-এর উদ্ধৃতিটি এখন পুরানো। এমএসডিএন এখন হ্যাশ কোডটি অনন্য না হওয়ার বিষয়ে স্পষ্ট নয়।
ব্যবহারকারী 34660

248

এগুলি সম্পর্কে কী শিখার পরে, আমি অনুমানের মাধ্যমে একটি আশাবাদী সরল ব্যাখ্যা লিখতে ভেবেছিলাম:

সংক্ষিপ্তসার: হ্যাশকোড কী?

  • এটি একটি আঙুলের ছাপ। আগ্রহী লোকদের সনাক্ত করতে আমরা এই আঙুলের মুদ্রণটি ব্যবহার করতে পারি।

আরো বিস্তারিত জানার জন্য নিচে পড়ুন:

হ্যাশকোডটিকে ভাবুন যেহেতু আমরা অনন্যভাবে কাউকে সনাক্ত করার চেষ্টা করছি

আমি একজন গোয়েন্দা, একজন অপরাধীর সন্ধানে। আসুন আমরা তাকে মিঃ ক্রুয়েল বলি। (আমি যখন ছোট ছিলাম তখন তিনি একজন কুখ্যাত খুনি ছিলেন - তিনি একটি গরীব মেয়েকে অপহরণ করে খুন করেছিলেন, তার মৃতদেহ ফেলে দিয়েছিলেন এবং তিনি এখনও ছিলে রয়েছেন - তবে এটি আলাদা বিষয়)। মিঃ ক্রুয়েল এর নির্দিষ্ট কিছু অদ্ভুত বৈশিষ্ট্য রয়েছে যা আমি তাকে মানুষের সমুদ্রের মধ্যে অনন্যভাবে চিহ্নিত করতে ব্যবহার করতে পারি। অস্ট্রেলিয়ায় আমাদের 25 মিলিয়ন লোক রয়েছে। তাদের একজন হলেন মিঃ ক্রুয়েল। আমরা কীভাবে তাকে খুঁজে পাব?

মিঃ ক্রুয়েলকে চিহ্নিত করার খারাপ উপায়

স্পষ্টতই মিঃ ক্রুয়েলের চোখ নীল। এটি তেমন সাহায্যকারী নয় কারণ অস্ট্রেলিয়ার প্রায় অর্ধেক জনসংখ্যারও চোখ নীল।

মিঃ ক্রুয়েল সনাক্তকরণের ভাল উপায়

আমি আর কি ব্যবহার করতে পারি? আমি জানি: আমি একটি আঙুলের ছাপ ব্যবহার করব!

সুবিধা :

  • দু'জনের একই আঙুলের মুদ্রণ করা সত্যিই কঠিন (অসম্ভব নয়, তবে অত্যন্ত অসম্ভব)।
  • মিঃ ক্রুয়েলের ফিঙ্গারপ্রিন্ট কখনই পরিবর্তন হবে না।
  • মিঃ ক্রুয়েলের পুরো অস্তিত্বের প্রতিটি অংশ: তার চেহারা, চুলের রঙ, ব্যক্তিত্ব, খাদ্যাভাস ইত্যাদি অবশ্যই (আধ্যাত্মিকভাবে) তার আঙুলের ছাপে প্রতিবিম্বিত হতে হবে, যেমন যদি তার একটি ভাই থাকে (যিনি খুব একই রকম তবে একই নয়) - তবে উভয়ই উচিত আছে বিভিন্ন আঙুলের ছাপ। আমি বলি "উচিত" কারণ আমরা এই 100% গ্যারান্টি দিতে পারি না যে এই পৃথিবীতে দু'জনের আলাদা আলাদা আঙ্গুলের ছাপ থাকবে।
  • তবে আমরা সর্বদা গ্যারান্টি দিতে পারি যে মিঃ ক্রুয়েল সর্বদা একই আঙুলের মুদ্রণ থাকবে - এবং তার আঙুলের ছাপটি কখনও পরিবর্তন হবে না।

উপরের বৈশিষ্ট্যগুলি সাধারণত ভাল হ্যাশ ফাংশন তৈরি করে।

তাহলে 'সংঘর্ষ' এর সাথে কী চুক্তি হয়েছে?

সুতরাং কল্পনা করুন যে আমি যদি নেতৃত্ব পাই এবং আমি মিঃ ক্রুয়েলের আঙুলের ছাপগুলির সাথে কোনও মিল খুঁজে পেয়েছি। এর অর্থ কি আমি মিঃ ক্রুয়েলকে পেয়েছি?

........ সম্ভবত! আমাকে অবশ্যই আরও কাছ থেকে দেখে নেওয়া উচিত। আমি যদি SHA256 (একটি হ্যাশিং ফাংশন) ব্যবহার করছি এবং আমি কেবল 5 জন লোক নিয়ে একটি ছোট্ট শহরে খুঁজছি - তবে আমি তাকে খুঁজে পাওয়ার খুব ভাল সুযোগ আছে! তবে আমি যদি এমডি 5 (অন্য একটি বিখ্যাত হ্যাশিং ফাংশন) ব্যবহার করছি এবং + 2 ^ 1000 লোকের সাথে কোনও শহরে আঙুলের ছাপগুলি পরীক্ষা করছি, তবে পুরোপুরি দুটি ভিন্ন ব্যক্তির একই আঙুলের ছাপ থাকতে পারে এটির যথেষ্ট সম্ভাবনা।

তাহলে যাইহোক এই সমস্ত কি লাভ?

হ্যাশকোডগুলির আসল উপকারটি হ'ল যদি আপনি কোনও হ্যাশ টেবিলের মধ্যে কিছু রাখতে চান - এবং হ্যাশ টেবিলগুলির সাহায্যে আপনি দ্রুত জিনিসগুলি সন্ধান করতে চান - এবং সেখানেই হ্যাশ কোডটি আসে They তারা আপনাকে হ্যাশ টেবিলগুলিতে সত্যই জিনিসগুলি খুঁজে পেতে দেয় allow দ্রুত। এটি এমন একটি হ্যাক যা ব্যাপকভাবে কর্মক্ষমতা উন্নত করে, তবে নির্ভুলতার একটি অল্প ব্যয়ে।

সুতরাং আসুন কল্পনা করুন যে আমাদের কাছে লোকেরা ভরা একটি হ্যাশ টেবিল রয়েছে - অস্ট্রেলিয়ায় 25 মিলিয়ন সন্দেহভাজন। মিঃ ক্রুয়েল সেখানে কোথাও আছেন ..... আমরা কীভাবে তাকে খুব দ্রুত খুঁজে পাব ? আমাদের এগুলি সবার মধ্যে বাছাই করা দরকার: একটি সম্ভাব্য মিল খুঁজে পাওয়া বা অন্যথায় সম্ভাব্য সন্দেহভাজনদের বেকসুর খালাস দিতে। আপনি প্রতিটি ব্যক্তির অনন্য বৈশিষ্ট্য বিবেচনা করতে চান না কারণ এতে অনেক বেশি সময় লাগবে। পরিবর্তে আপনি কি ব্যবহার করবেন? আপনি একটি হ্যাশকোড ব্যবহার করবেন! একটি হ্যাশকোড আপনাকে বলতে পারে যে দুটি ব্যক্তি আলাদা। জো ব্লগগুলি মিঃ ক্রুয়েল নয়। প্রিন্টগুলি যদি মেলে না তবে আপনি জানেন যে এটি অবশ্যই মিঃ ক্রুয়েল নয়। তবে, যদি আঙুলের ছাপগুলি মেলেতারপরে আপনি যে হ্যাশ ফাংশনটি ব্যবহার করেছেন তার উপর নির্ভর করে সম্ভাবনাগুলি ইতিমধ্যে বেশ ভাল you তবে এটি 100% নয়। আপনারা নিশ্চিত হতে পারেন যে একমাত্র উপায় হ'ল আরও তদন্ত করা: (i) তার / তার কোন সুযোগ / উদ্দেশ্য ছিল, (ii) সাক্ষী ইত্যাদি ইত্যাদি etc.

আপনি যখন কম্পিউটারগুলি ব্যবহার করছেন যদি দুটি বস্তুর হ্যাশ কোডের মান একই থাকে তবে আপনাকে আবার তদন্ত করতে হবে যে তারা সত্যই সমান কিনা। উদাহরণস্বরূপ, আপনাকে অবশ্যই যাচাই করতে হবে যে বস্তুর সমান উচ্চতা, একই ওজন ইত্যাদি রয়েছে কিনা, যদি পূর্ণসংখ্যা একই হয়, বা গ্রাহক_আইডি একটি মিল হয় এবং তারপরে সিদ্ধান্তে পৌঁছাতে হবে যে সেগুলি সমান কিনা। এটি সাধারণত কোনও আইকোপ্যামার বা আইকোয়ালিটি ইন্টারফেস প্রয়োগ করে করা হয়।

কী সংক্ষিপ্তসার

সুতরাং মূলত হ্যাশকোড একটি আঙুলের মুদ্রণ।

ডিজিটাল ফিঙ্গারপ্রিন্ট - পিক্সাবায় ছবির অ্যাট্রিবিউট - ব্যবহারের জন্য নিখরচায় উপলব্ধ: https://pixabay.com/en/finger-fingerprint- সুরক্ষা- ডিজিটাল-2081169/

  1. দুটি পৃথক ব্যক্তি / বস্তুর তাত্ত্বিকভাবে এখনও একই আঙুলের ছাপ থাকতে পারে। বা অন্য কথায়। আপনার যদি দুটি আঙুলের ছাপ একই থাকে ......... তবে তাদের উভয়ই একই ব্যক্তি / বস্তু থেকে আসার দরকার নেই।
  2. তবুও, একই ব্যক্তি / অবজেক্ট সর্বদা একই ফিঙ্গারপ্রিন্ট ফিরিয়ে দেবে ।
  3. যার অর্থ হ'ল যদি দুটি অবজেক্ট বিভিন্ন হ্যাশ কোডগুলি ফেরত দেয় তবে আপনি 100% নিশ্চিততার জন্য জানেন যে এই বিষয়গুলি আলাদা।

উপরের দিকে আপনার মাথা পেতে এটি ভাল 3 মিনিট সময় নেয়। বোধগম্য না হওয়া পর্যন্ত এটি কয়েকবার পড়ুন। আমি আশা করি এটি কাউকে সাহায্য করবে কারণ এগুলি শিখতে আমার জন্য অনেক শোক লেগেছে!


1
পুনরায়: এমএসডিএন ডকুমেন্টেশন আমার মস্তিস্কের কয়েকটি কোষকে হত্যা করেছে .... আমার বেশ কয়েকটিকে আত্মহত্যার প্রান্তে নিয়ে গেছে। কেবলমাত্র আমি ঘুমিয়ে
পড়েছি

আপনি শেষে আপনার দুর্দান্ত ব্যাখ্যাটি সেই নক্ষত্রমুখে মন্তব্য দিয়ে ধ্বংস করেছেন।
ওয়াল্ডেমার গাজনোস্কি

আমি এটা পছন্দ করি! মূলত নাম "মিস্টার ক্রুয়েল!
পেড্রো

একজন সত্যিকারের অপরাধের অনুরাগী হিসাবে এটি সম্ভবত আমার সবচেয়ে প্রিয় এসও উত্তর ... এখন পর্যন্ত।
ইফলেসট্রিচ্যাচ

11

GetHashCode()হ্যাশ টেবিলগুলির কী হিসাবে অবজেক্টটি ব্যবহার করে সহায়তা করতে সহায়তা করা হয়। (জাভা ইত্যাদিতেও একই জিনিস বিদ্যমান)। লক্ষ্যটি প্রতিটি বস্তুর স্বতন্ত্র হ্যাশ কোডটি ফিরিয়ে আনার জন্য, তবে এটি প্রায়শই একেবারে গ্যারান্টিযুক্ত হতে পারে না। এটা তোলে হয় প্রয়োজনীয় যদিও যে দুটি কথাটি সমান বস্তু আসতে একই হ্যাশ কোড।

একটি সাধারণ হ্যাশ টেবিল বাস্তবায়ন হ্যাশকোড মান দিয়ে শুরু হয়, একটি মডুলাস নেয় (এইভাবে মানটি একটি সীমার মধ্যে সীমাবদ্ধ করে) এবং এটি "বালতি" এর অ্যারেতে সূচক হিসাবে ব্যবহার করে।


8

এটি ডাব্লুপি 7 এর পক্ষে অনন্য নয় - এটি সমস্ত। নেট বস্তুগুলিতে উপস্থিত। এটি আপনার বর্ণনা অনুসারে বাছাই করে তবে আমি এটি আপনার অ্যাপ্লিকেশনগুলিতে একটি অনন্য সনাক্তকারী হিসাবে সুপারিশ করব না, কারণ এটি অনন্য হওয়ার গ্যারান্টিযুক্ত নয়।

অবজেক্ট.গেটহ্যাশকোড পদ্ধতি


4

এটি এখানে এমএসডিএন নিবন্ধ থেকে:

https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/

"আপনি যখন শুনবেন যে লোকেদের জন্য হ্যাশ কোডগুলি একটি প্রদত্ত ইনপুটটির জন্য একটি অনন্য মান উত্পন্ন করে, তবে সত্যটি হ'ল এটি সম্পাদন করা কঠিন হলেও একই মানটিতে হ্যাশযুক্ত দুটি পৃথক ডেটা ইনপুটগুলি খুঁজে পাওয়া প্রযুক্তিগতভাবে সম্ভব । তবে, সত্য একটি হ্যাশ অ্যালগরিদম এর কার্যকারিতা সম্পর্কিত কারণগুলি উত্পন্ন হ্যাশ কোডের দৈর্ঘ্যে এবং ডেটা হ্যাশ হওয়ার জটিলতায় থাকে lie "

সুতরাং আপনার ডেটা আকারের জন্য উপযুক্ত একটি হ্যাশ অ্যালগরিদম ব্যবহার করুন এবং এতে অনন্য হ্যাশকোড থাকবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.