CodeGym /Java Blog /এলোমেলো /জাভা হ্যাশকোড()
John Squirrels
লেভেল 41
San Francisco

জাভা হ্যাশকোড()

এলোমেলো দলে প্রকাশিত

হ্যাশ নীতি

প্রথমত, আমরা জাভা হ্যাশকোড সংজ্ঞায়িত করার আগে, আমাদের বুঝতে হবে হ্যাশিং কী এবং এটি কীসের জন্য। হ্যাশিং হল কিছু ডেটাতে হ্যাশ ফাংশন প্রয়োগ করার একটি প্রক্রিয়া। একটি হ্যাশ ফাংশন শুধুমাত্র একটি গাণিতিক ফাংশন. এই সম্পর্কে চিন্তা করবেন না! "গাণিতিক" মানে সবসময় "জটিল" নয়। এখানে এর অর্থ শুধুমাত্র আমাদের কাছে কিছু ডেটা এবং একটি নির্দিষ্ট নিয়ম রয়েছে যা ডেটাকে অক্ষরের (কোড) সেটে ম্যাপ করে। উদাহরণস্বরূপ, এটি একটি হেক্সাডেসিমাল সাইফার হতে পারে। আমরা ইনপুট এ যে কোনো আকারের কিছু তথ্য আছে, এবং এটি একটি হ্যাশ ফাংশন প্রয়োগ. আউটপুটে, আমরা একটি নির্দিষ্ট-আকারের ডেটা পাই, বলুন, 32টি অক্ষর। সাধারণত, এই ধরনের ফাংশন ডেটার একটি বড় অংশকে একটি ছোট পূর্ণসংখ্যা মানের মধ্যে রূপান্তর করে। এই ফাংশনের কাজের ফলাফলকে হ্যাশ কোড বলা হয়। হ্যাশ ফাংশনগুলি ক্রিপ্টোগ্রাফিতে এবং কিছু অন্যান্য ক্ষেত্রেও ব্যাপকভাবে ব্যবহৃত হয়। হ্যাশ ফাংশন ভিন্ন হতে পারে,
  • একটি নির্দিষ্ট বস্তুর একটি নির্দিষ্ট হ্যাশকোড আছে।
  • যদি দুটি বস্তু সমান হয়, তাদের হ্যাশকোড একই। বিপরীত সত্য নয়।
  • যদি হ্যাশ কোড ভিন্ন হয়, তাহলে বস্তুগুলো নিশ্চিতভাবে সমান নয়।
  • বিভিন্ন বস্তুর একই হ্যাশ কোড থাকতে পারে। যাইহোক, এটি একটি খুব অসম্ভাব্য ঘটনা। এই মুহুর্তে, আমাদের একটি সংঘর্ষ, একটি পরিস্থিতি, যেখানে আমরা ডেটা হারাতে পারি।
"যথাযথ" হ্যাশ ফাংশন সংঘর্ষের সম্ভাবনা কমিয়ে দেয়।

জাভাতে হ্যাশকোড

জাভাতে হ্যাশ ফাংশন সাধারণত হ্যাশকোড() পদ্ধতিতে সংযুক্ত থাকে । সঠিকভাবে, একটি অবজেক্টে একটি হ্যাশ ফাংশন প্রয়োগের ফলাফল একটি হ্যাশকোড। প্রতিটি জাভা অবজেক্টের একটি হ্যাশ কোড থাকে। সাধারণভাবে হ্যাশ কোড হল ক্লাসের হ্যাশকোড() পদ্ধতি দ্বারা গণনা করা একটি সংখ্যা Object। সাধারণত, প্রোগ্রামাররা তাদের অবজেক্টের জন্য এই পদ্ধতিটিকে ওভাররাইড করে সেইসাথে হ্যাশকোড() সমান () পদ্ধতির সাথে সম্পর্কিত নির্দিষ্ট ডেটার আরও দক্ষ প্রক্রিয়াকরণের জন্য। হ্যাশকোড () পদ্ধতিটি একটি int (4 বাইট) মান প্রদান করে, যা বস্তুর একটি সংখ্যাসূচক উপস্থাপনা। এই হ্যাশকোডটি ব্যবহার করা হয়, উদাহরণস্বরূপ, ডেটার আরও দক্ষ সঞ্চয়স্থানের জন্য সংগ্রহের মাধ্যমে এবং সেই অনুযায়ী, দ্রুত অ্যাক্সেসের জন্য। ডিফল্টরূপে, হ্যাশকোড()একটি বস্তুর জন্য ফাংশন মেমরি সেলের সংখ্যা প্রদান করে যেখানে বস্তুটি সংরক্ষণ করা হয়। অতএব, যদি অ্যাপ্লিকেশন কোডে কোন পরিবর্তন করা না হয়, তাহলে ফাংশনটি একই মান প্রদান করবে। কোড সামান্য পরিবর্তিত হলে, হ্যাশকোড মানও পরিবর্তিত হয়। হ্যাশকোড কি জাভাতে ব্যবহৃত হয়? প্রথমত জাভা হ্যাশকোড প্রোগ্রামগুলিকে দ্রুত চালাতে সাহায্য করে। উদাহরণ স্বরূপ, যদি আমরা দুটি বস্তু o1এবং o2কিছু প্রকারের তুলনা করি, তাহলে অপারেশনটি o1.equals(o2)এর চেয়ে প্রায় 20 গুণ বেশি সময় নেয় o1.hashCode() == o2.hashCode()

জাভা সমান()

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

হ্যাশকোড() পদ্ধতি বাস্তবায়ন করা

উদাহরণ

চলুন একটি ক্ষেত্র - নাম দিয়ে একটি ক্লাস ক্যারেক্টার তৈরি করি । এর পরে, আমরা ক্যারেক্টার ক্লাস, character1 এবং character2 এর দুটি অবজেক্ট তৈরি করি এবং তাদের একই নাম সেট করি। যদি আমরা অবজেক্ট ক্লাসের ডিফল্ট হ্যাশকোড() এবং সমান() ব্যবহার করি , আমরা অবশ্যই আলাদা পাব, সমান অবজেক্ট নয়। এভাবেই জাভাতে হ্যাশকোড কাজ করে। তাদের বিভিন্ন হ্যাশকোড থাকবে কারণ তারা বিভিন্ন মেমরি কোষে রয়েছে এবং সমান() অপারেশন ফলাফল মিথ্যা হবে।

import java.util.Objects;

public class Character {
    private String Name;

    public Character(String name) {
        Name = name;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    } 

    public static void main(String[] args) {
        Character character1 = new Character("Arnold");
        System.out.println(character1.getName());
        System.out.println(character1.hashCode());
        Character character2 = new Character("Arnold");
        System.out.println(character2.getName());
        System.out.println(character2.hashCode());
        System.out.println(character2.equals(character1));
    }
}
প্রোগ্রাম চালানোর ফলাফল:

Arnold
1595428806
Arnold
1072408673
false
কনসোলে দুটি 10-সংখ্যার সংখ্যা হল হ্যাশকোড। যদি আমরা সমান বস্তু থাকতে চাই যদি তাদের একই নাম থাকে? আমাদের কি করা উচিৎ? উত্তর: আমাদের ক্যারেক্টার ক্লাসের জন্য অবজেক্ট ক্লাসের হ্যাশকোড() এবং সমান() পদ্ধতিগুলিকে ওভাররাইড করা উচিত। আমরা IDEA IDE-তে স্বয়ংক্রিয়ভাবে এটি করতে পারি, শুধু আপনার কীবোর্ডে alt + insert চাপুন এবং Generate -> equals() এবং hashCode() নির্বাচন করুন । আমাদের উদাহরণের ক্ষেত্রে আমরা পরবর্তী কোড পেয়েছি: জাভা হ্যাশকোড () - 2 কি?

import java.util.Objects;

public class Character {
    private String Name;

    public Character(String name) {
        Name = name;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Character)) return false;

        Character character = (Character) o;

        return getName() != null ? getName().equals(character.getName()) : character.getName() == null;
    }

    @Override
    public int hashCode() {
        return getName() != null ? getName().hashCode() : 0;
    }

    public static void main(String[] args) {
        Character character1 = new Character("Arnold");
        System.out.println(character1.getName());
        System.out.println(character1.hashCode());
        Character character2 = new Character("Arnold");
        System.out.println(character2.getName());
        System.out.println(character2.hashCode());
        System.out.println(character2.equals(character1));
    }
}
এই কোড চালানোর ফলাফল:

Arnold
1969563338
Arnold
1969563338
true
সুতরাং এখন প্রোগ্রামটি আমাদের অবজেক্টকে সমান হিসাবে চিহ্নিত করে এবং তাদের একই হ্যাশকোড রয়েছে।

জাভা হ্যাশকোড উদাহরণ:

আপনার নিজস্ব হ্যাশকোড() এবং সমান()

আপনি নিজের সমান() এবং হ্যাশকোড() উপলব্ধিগুলিও তৈরি করতে পারেন, তবে সতর্ক থাকুন এবং হ্যাশকোড সংঘর্ষগুলি কমিয়ে আনার কথা মনে রাখবেন। এখানে ছাত্র শ্রেণীতে আমাদের নিজস্ব হ্যাশকোড() এবং সমান() পদ্ধতির একটি উদাহরণ রয়েছে :

import java.util.Date;

public class Student {
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }
//Java hashcode example
   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
এবং প্রধান শ্রেণী তাদের কাজ প্রদর্শন করতে:

import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;

public class Main {
   static HashMap<Student, Integer> cache = new HashMap<Student, Integer>(); // <person, targetPriority>

   public static void main(String[] args) {
       Student sarah1 = new Student("Sarah","Connor", "Jane", null);
       Student sarah2 = new Student("Sarah","Connor", "Jane", new Date(1970, 01-1, 01));
       Student sarah3 = new Student("Sarah","Connor", "Jane", new Date(1959, 02-1, 28)); // date not exists
       Student john = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
       Student johnny = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
       System.out.println(john.hashCode());
       System.out.println(johnny.hashCode());
       System.out.println(sarah1.hashCode());
       System.out.println();
       cache.put(sarah1, 1);
       cache.put(sarah2, 2);
       cache.put(sarah3, 3);
       System.out.println(new Date(sarah1.birthday));
       System.out.println();
       cache.put(john, 5);
       System.out.println(cache.get(john));
       System.out.println(cache.get(johnny));
       cache.put(johnny, 7);
       System.out.println(cache.get(john));
       System.out.println(cache.get(johnny));
   }
}

হ্যাশকোড কি জন্য ব্যবহার করা হয়?

প্রথমত হ্যাশকোড প্রোগ্রামগুলিকে দ্রুত চালাতে সাহায্য করে। উদাহরণস্বরূপ, যদি আমরা দুটি বস্তু o1এবং o2কিছু ধরণের তুলনা করি, অপারেশনটি o1.equals(o2)o1.hashCode() == o2.hashCode() থেকে প্রায় 20 গুণ বেশি সময় নেয়। জাভাতে হ্যাশিং নীতি কিছু জনপ্রিয় সংগ্রহের পিছনে দাঁড়িয়েছে, যেমন হ্যাশম্যাপ , হ্যাশসেট এবং হ্যাশটেবল

উপসংহার

প্রতিটি জাভা অবজেক্টের হ্যাশকোড() এবং সমান() পদ্ধতি অবজেক্ট ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত। একটি ভাল কাজের সমতা মেকানিজম পেতে, আপনি আপনার নিজের ক্লাসের জন্য হ্যাশকোড() এবং সমান() পদ্ধতিগুলিকে ওভাররাইড করবেন। হ্যাশকোড ব্যবহার করে প্রোগ্রামগুলি দ্রুত চালানো হয়।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION