জাভাতে হ্যাশকোডের ব্যবহার কী?


161

জাভাতে, obj.hashCode()কিছু মান দেয়। প্রোগ্রামিংয়ে এই হ্যাশ কোডটির ব্যবহার কী?


এই প্রশ্নটি আরও কিছু বিশদ যুক্ত করে। stackoverflow.com/questions/18078779/...
MaheshVarma

1
এই পোস্টে দেওয়া সুন্দর ব্যাখ্যা। eclipsesource.com/blogs/2012/09/04/…
বিজয় ভানখেদে

উত্তর:


222

hashCode()জন্য ব্যবহার করা হয় bucketing মধ্যে Hashপছন্দ বাস্তবায়নের HashMap, HashTable, HashSet, ইত্যাদি

প্রাপ্ত মানটি সেট / মানচিত্রের উপাদানগুলি সংরক্ষণের জন্য বালতি নম্বরhashCode() হিসাবে ব্যবহৃত হয় । এই বালতি নম্বরটি সেট / মানচিত্রের অভ্যন্তরের উপাদানটির ঠিকানা

আপনি যখন contains()এটি করবেন তখন উপাদানটির হ্যাশ কোডটি নেবে, তারপরে বালতিটি সন্ধান করুন যেখানে হ্যাশ কোডটি নির্দেশ করেছে। যদি একই বালতিতে 1 টিরও বেশি উপাদান পাওয়া যায় (একাধিক বস্তুর একই হ্যাশ কোড থাকতে পারে), তবে এটি equals()বস্তু সমান কিনা তা মূল্যায়নের জন্য পদ্ধতিটি ব্যবহার করে , এবং তারপরে contains()সত্য বা মিথ্যা কিনা তা সিদ্ধান্ত নিতে পারে বা উপাদানটি হতে পারে কিনা তা সিদ্ধান্ত নিতে পারে সেট বা না যোগ করা।


28
হাই বাডি .. খুব সুন্দর উত্তর কিন্তু বাস্তব উদাহরণটি বোঝার জন্য সহজটির
321515

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

2
"যদি একই বালতিতে 1 টিরও বেশি উপাদান পাওয়া যায় .. তবে এটি equals()মূল্যায়নের জন্য ব্যবহার করে ", সুতরাং যদি কেবল একটি হ্যাশ কোডের সাথে ম্যাচ করা উপাদান পাওয়া যায়, তবে তা সরাসরি সত্য হয়ে যায়? তবে যেহেতু একাধিক অবজেক্টের একই হ্যাশ কোড থাকতে পারে তাই এটি equals()মিলে যাওয়া উপাদানটি সমান হলে তা মূল্যায়নের জন্য চালাতে হবে, অন্যথায় এটি আপনাকে অপ্রত্যাশিত ফলাফল দিতে পারে, আমি ঠিক আছি?
সাওরকিডো

বালতি একপাশে রেখে হ্যাশকোড এমন একটি পদ্ধতি যা প্রতিটি বস্তুকে স্মৃতিতে সঞ্চয় করার ক্রম নির্ধারণের জন্য বস্তুটি কল করে। যদি বস্তু সমান হয় তবে তাদের হ্যাশকোডও সমান হতে হবে। (এই বিবৃতিটির কথোপকথনটি মিথ্যা)
NoName

1
কোন ক্ষেত্রে কোনও প্রোগ্রামার ম্যানুয়ালি hashCode()পদ্ধতিটিতে প্রার্থনা করবে ?
কার্ডিনাল -

33

জাভাডোক থেকে :

বস্তুর জন্য একটি হ্যাশ কোড মান প্রদান করে। এই পদ্ধতিটি হ্যাশ টেবিলের সুবিধার জন্য সমর্থিত যেমন সরবরাহ করে java.util.Hashtable

এর সাধারণ চুক্তি hashCodeহ'ল:

  • যখনই এটি কোনও জাভা অ্যাপ্লিকেশন কার্যকর করার সময় একই বস্তুটির উপরে একাধিকবার আহ্বান করা হয় তখন hashCodeপদ্ধতিটি অবশ্যই ধারাবাহিকভাবে একই পূর্ণসংখ্যার সাথে ফেরত পাঠাতে হবে , তবে প্রদত্ত বস্তুর সমান তুলনায় কোনও তথ্য সংশোধিত না হয়। এই পূর্ণসংখ্যার কোনও প্রয়োগের একটি প্রয়োগ থেকে একই অ্যাপ্লিকেশনটির অন্য প্রয়োগে সামঞ্জস্য থাকা উচিত নয়।

  • equals(Object)পদ্ধতি অনুসারে যদি দুটি বস্তু সমান হয় , তবে hashCodeদুটি বস্তুর প্রতিটিতে পদ্ধতিটি কল করার জন্য অবশ্যই একই সংখ্যার ফলাফল তৈরি করা উচিত।

  • এটি প্রয়োজন হয় না যদি equals(java.lang.Object)পদ্ধতি অনুসারে দুটি বস্তু অসম হয় , তবে hashCodeদুটি বস্তুর প্রতিটিতে পদ্ধতিটি কল করার জন্য পৃথক পূর্ণসংখ্যার ফলাফল অবশ্যই পাওয়া উচিত। তবে প্রোগ্রামারকে সচেতন হওয়া উচিত যে অসম বস্তুর জন্য স্বতন্ত্র পূর্ণসংখ্যার ফলাফলগুলি হ্যাশটবেলের কার্যকারিতা উন্নত করতে পারে।

যথাযথভাবে ব্যবহারিক হিসাবে যতটা কার্যকর, শ্রেণি অবজেক্ট দ্বারা সংজ্ঞায়িত হ্যাশকোড পদ্ধতিটি পৃথক বস্তুর জন্য পৃথক পূর্ণসংখ্যা ফেরত দেয়। (এটি সাধারণত বস্তুর অভ্যন্তরীণ ঠিকানাটিকে পূর্ণসংখ্যার সাথে রূপান্তর করে প্রয়োগ করা হয় , তবে জাভা প্রোগ্রামিং ভাষার দ্বারা এই প্রয়োগকরণ কৌশলটি প্রয়োজন হয় না))


14

এর দ্বারা প্রত্যাবর্তিত মান hashCode()হ'ল অবজেক্টের হ্যাশ কোড, যা হেক্সাডেসিমালে অবজেক্টের মেমরি ঠিকানা।

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

এই উত্তরটি জাভা এসই 8 অফিসিয়াল টিউটোরিয়াল ডকুমেন্টেশন থেকে


13

hashCode()এমন একটি ফাংশন যা কোনও বস্তু নেয় এবং একটি সংখ্যার মানকে আউটপুট করে। যদি কোনও বস্তুর পরিবর্তন না হয় তবে অবজেক্টের জন্য হ্যাশকোড সবসময় একই থাকে।

কার্যাবলী পছন্দ HashMap, HashTable, HashSet, ইত্যাদি যে দোকান বস্তু করার প্রয়োজন হয়, ব্যবহার করবে hashCodeতাদের অভ্যন্তরীণ অ্যারের আকার modulo কি "মেমরি অবস্থান" (অর্থাত অ্যারের অবস্থান) বস্তুর সংরক্ষণ করার জন্য পছন্দ করে নিন।

কিছু ক্ষেত্রে রয়েছে যেখানে সংঘর্ষের ঘটনা ঘটতে পারে (দুটি জিনিস একই হ্যাশকোড দিয়ে শেষ হয়) এবং অবশ্যই এটি সাবধানে সমাধান করা দরকার।


6

যদিও হ্যাশকোড আপনার ব্যবসায়ের যুক্তি দিয়ে কিছুই করে না, বেশিরভাগ ক্ষেত্রে আমাদের এটির যত্ন নিতে হবে। কারণ যখন আপনার অবজেক্টটি হ্যাশ ভিত্তিক ধারক (হ্যাশসেট, হ্যাশম্যাপ ...) এ রাখা হয় তখন ধারকটি উপাদানটির হ্যাশকোড রাখে / পায়।


না এটা হয় না। এটি কী রাখে / পায়। হ্যাশকোডটি কেবল বালতি করার জন্য ব্যবহৃত হয়
লর্নে

3

একটি হ্যাশকোড হ'ল যে কোনও বস্তু থেকে উত্পন্ন একটি সংখ্যা।

এটি হ্যাশটেবলে অবজেক্টগুলি দ্রুত সংরক্ষণ / পুনরুদ্ধার করতে দেয়।

নিম্নলিখিত সাধারণ উদাহরণটি কল্পনা করুন :

আপনার সামনে টেবিলের উপর। আপনার নয়টি বাক্স রয়েছে, যার প্রতিটি 1 থেকে 9 নম্বর চিহ্নযুক্ত রয়েছে You

আপনার যা প্রয়োজন তা তাৎক্ষণিকভাবে সিদ্ধান্ত নেওয়ার একটি উপায় যা আপনি প্রতিটি বস্তুটি রেখেছেন box এটি একটি সূচকের মতো কাজ করে। আপনি বাঁধাকপিটি সন্ধান করার সিদ্ধান্ত নিয়েছেন যাতে বাঁধাকপিটি কোন বাক্সে রয়েছে তা সন্ধান করুন, তবে এটি পেতে সরাসরি বাক্সে যান।

এখন কল্পনা করুন যে আপনি সূচকটি নিয়ে বিরক্ত করতে চান না, আপনি যে বাক্সটিতে বাস করছেন তা অবিলম্বে খুঁজে পেতে সক্ষম হতে চান।

উদাহরণস্বরূপ, আসুন এটি করার একটি খুব সহজ উপায় ব্যবহার করুন - বস্তুর নামে অক্ষরের সংখ্যা। বাঁধাকপি 7 বাক্সে যায়, মটর 3 বাক্সে যায়, বাক্স 6-র রকেট, বাক্স 5-এ ব্যানজো এবং আরও কিছু।

গণ্ডারদের কী হবে, তবে? এটির 10 টি অক্ষর রয়েছে, সুতরাং আমরা আমাদের অ্যালগরিদমকে কিছুটা পরিবর্তন করব এবং "চারপাশে মোড়ানো" করব যাতে 10-অক্ষরের অবজেক্টগুলি বাক্স 1-তে, বাক্স 2-এর 11 অক্ষর এবং আরও কিছু যায়। এটি কোনও বিষয় আবরণ করা উচিত।

কখনও কখনও কোনও বাক্সে এটির একাধিক অবজেক্ট থাকে তবে আপনি যদি রকেটের সন্ধান করছেন তবে বাঁধাকপি, মটর, বেঞ্জো এবং গন্ডার পুরো গাদা পরীক্ষা করার চেয়ে চিনাবাদাম এবং রকেটের তুলনা করা আরও দ্রুত।

এটি একটি হ্যাশ কোড। কোনও অবজেক্ট থেকে নম্বর পাওয়ার একটি উপায় যাতে এটি হ্যাশটেবলে সংরক্ষণ করা যায়। জাভাতে, একটি হ্যাশ কোড যে কোনও পূর্ণসংখ্যার হতে পারে এবং প্রতিটি বস্তুর ধরণের নিজস্ব তৈরির জন্য দায়বদ্ধ। অবজেক্টের "হ্যাশকোড" পদ্ধতিটি অনুসন্ধান করুন।

উত্স - এখানে


-1

হ্যাশকোড () এর ব্যবহারগুলির মধ্যে একটি ক্যাচিং মেকানিজম তৈরি করছে । এই উদাহরণটি দেখুন:

        class Point
    {
      public int x, y;

      public Point(int x, int y)
      {
        this.x = x;
        this.y = y;
      }

      @Override
      public boolean equals(Object o)
      {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Point point = (Point) o;

        if (x != point.x) return false;
        return y == point.y;
      }

      @Override
      public int hashCode()
      {
        int result = x;
        result = 31 * result + y;
        return result;
      }

class Line
{
  public Point start, end;

  public Line(Point start, Point end)
  {
    this.start = start;
    this.end = end;
  }

  @Override
  public boolean equals(Object o)
  {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Line line = (Line) o;

    if (!start.equals(line.start)) return false;
    return end.equals(line.end);
  }

  @Override
  public int hashCode()
  {
    int result = start.hashCode();
    result = 31 * result + end.hashCode();
    return result;
  }
}
class LineToPointAdapter implements Iterable<Point>
{
  private static int count = 0;
  private static Map<Integer, List<Point>> cache = new HashMap<>();
  private int hash;

  public LineToPointAdapter(Line line)
  {
    hash = line.hashCode();
    if (cache.get(hash) != null) return; // we already have it

    System.out.println(
      String.format("%d: Generating points for line [%d,%d]-[%d,%d] (no caching)",
        ++count, line.start.x, line.start.y, line.end.x, line.end.y));
}

'ক্যাচিং মেকানিজম' গড়ার অর্থ কী? এবং এই কোডটি কীভাবে এটি চিত্রিত করে?
লার্নের

-1

hashCode()হ'ল একটি অনন্য কোড যা প্রতিটি বস্তু তৈরির জন্য জেভিএম তৈরি করে।

আমরা hashCode()হ্যাশটেবল, হাশম্যাপ ইত্যাদি সম্পর্কিত হ্যাশিং সম্পর্কিত অ্যালগরিদম সম্পর্কে কিছু অপারেশন করতে ব্যবহার করি ..

hashCode()অনুসন্ধানের ক্রিয়াকলাপটি সহজ করার সুবিধাগুলি কারণ যখন আমরা কোনও অনন্য কোডযুক্ত কোনও বিষয় অনুসন্ধান করি তখন এটি সেই অবজেক্টটি সন্ধান করতে সহায়তা করে।

তবে আমরা বলতে পারি না hashCode()কোনও বস্তুর ঠিকানা। এটি প্রতিটি জিনিসের জন্য জেভিএম দ্বারা উত্পাদিত একটি অনন্য কোড।

এজন্য আজকাল হ্যাশিং অ্যালগরিদম হ'ল সর্বাধিক জনপ্রিয় অনুসন্ধান অ্যালগরিদম।


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