CodeGym /جاوا بلاگ /Random-UR /جاوا ہیش کوڈ ()
John Squirrels
سطح
San Francisco

جاوا ہیش کوڈ ()

گروپ میں شائع ہوا۔

ہیش کا اصول

سب سے پہلے، اس سے پہلے کہ ہم جاوا ہیش کوڈ کی وضاحت کریں، ہمیں یہ سمجھنا ہوگا کہ ہیشنگ کیا ہے اور یہ کس لیے ہے۔ ہیشنگ کچھ ڈیٹا پر ہیش فنکشن لگانے کا عمل ہے۔ ایک ہیش فنکشن صرف ایک ریاضیاتی فنکشن ہے۔ اس کے بارے میں فکر مت کرو! "ریاضی" کا مطلب ہمیشہ "پیچیدہ" نہیں ہوتا ہے۔ یہاں اس کا مطلب صرف یہ ہے کہ ہمارے پاس کچھ ڈیٹا اور ایک خاص اصول ہے جو ڈیٹا کو حروف کے ایک سیٹ (کوڈ) میں نقش کرتا ہے۔ مثال کے طور پر، یہ ایک ہیکساڈیسیمل سائفر ہو سکتا ہے۔ ہمارے پاس ان پٹ پر کسی بھی سائز کا کچھ ڈیٹا ہے، اور اس پر ہیش فنکشن لگاتے ہیں۔ آؤٹ پٹ پر، ہمیں 32 حروف کا ایک مقررہ سائز کا ڈیٹا ملتا ہے۔ عام طور پر، اس قسم کا فنکشن ڈیٹا کے ایک بڑے ٹکڑے کو ایک چھوٹی عددی قدر میں تبدیل کرتا ہے۔ اس فنکشن کے کام کا نتیجہ ہیش کوڈ کہلاتا ہے۔ ہیش فنکشن بڑے پیمانے پر کرپٹوگرافی اور کچھ دوسرے شعبوں میں بھی استعمال ہوتے ہیں۔ ہیش کے افعال مختلف ہو سکتے ہیں، لیکن ان سب میں کچھ خاص خصوصیات ہیں:
  • کسی خاص چیز کا ایک خاص ہیش کوڈ ہوتا ہے۔
  • اگر دو اشیاء برابر ہیں، تو ان کے ہیش کوڈ ایک جیسے ہیں۔ الٹا سچ نہیں ہے۔
  • اگر ہیش کوڈز مختلف ہیں، تو یقینی طور پر اشیاء برابر نہیں ہیں۔
  • مختلف اشیاء میں ایک ہی ہیش کوڈ ہو سکتا ہے۔ تاہم، یہ ایک بہت ہی غیر متوقع واقعہ ہے۔ اس مقام پر، ہمارے پاس تصادم ہے، ایسی صورتحال ہے، جہاں ہم ڈیٹا کھو سکتے ہیں۔
"مناسب" ہیش فنکشن تصادم کے امکان کو کم کرتا ہے۔

جاوا میں ہیش کوڈ

جاوا میں ہیش فنکشن عام طور پر hashCode() طریقہ سے منسلک ہوتا ہے ۔ واضح طور پر، کسی آبجیکٹ پر ہیش فنکشن لگانے کا نتیجہ ہیش کوڈ ہے۔ ہر جاوا آبجیکٹ میں ہیش کوڈ ہوتا ہے۔ عام طور پر ہیش کوڈ ایک عدد ہے جسے کلاس کے ہیش کوڈ () طریقہ سے شمار کیا جاتا ہے۔ Objectعام طور پر، پروگرامرز اپنی اشیاء کے ساتھ ساتھ مخصوص ڈیٹا کی زیادہ موثر پروسیسنگ کے لیے hashCode() the equals() طریقہ سے متعلق اس طریقہ کو اوور رائیڈ کرتے ہیں۔ hashCode () طریقہ ایک int (4 بائٹس) قدر لوٹاتا ہے، جو کہ آبجیکٹ کی عددی نمائندگی ہے۔ یہ ہیش کوڈ استعمال کیا جاتا ہے، مثال کے طور پر، ڈیٹا کے زیادہ موثر ذخیرہ کرنے اور اس کے مطابق، ان تک تیز تر رسائی کے لیے جمع کرنے کے ذریعے۔ پہلے سے طے شدہ طور پر، کسی آبجیکٹ کے لیے hashCode() فنکشن میموری سیل کا نمبر لوٹاتا ہے جہاں آبجیکٹ محفوظ ہے۔ لہذا، اگر ایپلیکیشن کوڈ میں کوئی تبدیلی نہیں کی جاتی ہے، تو فنکشن کو وہی قدر واپس کرنی چاہیے۔ اگر کوڈ تھوڑا سا تبدیل ہوتا ہے، تو ہیش کوڈ کی قدر بھی بدل جاتی ہے۔ جاوا میں ہیش کوڈ کس کے لیے استعمال ہوتا ہے؟ سب سے پہلے جاوا ہیش کوڈ پروگراموں کو تیزی سے چلانے میں مدد کرتے ہیں۔ مثال کے طور پر، اگر ہم دو چیزوں o1اور o2کسی قسم کی چیزوں کا موازنہ کریں، تو آپریشن o1.equals(o2)کے مقابلے میں 20 گنا زیادہ وقت لگتا ہے o1.hashCode() == o2.hashCode()۔

جاوا برابر ()

پیرنٹ کلاس میں ، hashCode()Object طریقہ کے ساتھ ، بھی ہے equals() ، وہ فنکشن جو دو اشیاء کی مساوات کو چیک کرنے کے لیے استعمال ہوتا ہے۔ اس فنکشن کا ڈیفالٹ نفاذ صرف دو اشیاء کے لنکس کو ان کی مساوات کے لیے چیک کرتا ہے۔ equals() اور hashCode() کا ان کا معاہدہ ہے، لہذا اگر آپ ان میں سے ایک کو اوور رائیڈ کرتے ہیں، تو آپ کو دوسرے کو اوور رائڈ کرنا چاہیے، تاکہ اس معاہدے کو توڑا نہ جائے۔

hashCode() طریقہ کو نافذ کرنا

مثال

آئیے ایک فیلڈ کے ساتھ کلاس کریکٹر بنائیں — نام ۔ اس کے بعد، ہم کریکٹر کلاس کی دو آبجیکٹ بناتے ہیں، character1 ، اور character2 اور انہیں ایک ہی نام سیٹ کرتے ہیں۔ اگر ہم آبجیکٹ کلاس کے ڈیفالٹ ہیش کوڈ () اور برابر () استعمال کرتے ہیں، تو ہمیں یقینی طور پر مختلف چیزیں ملیں گی، نہ کہ مساوی اشیاء۔ جاوا میں ہیش کوڈ اس طرح کام کرتا ہے۔ ان کے پاس مختلف ہیش کوڈز ہوں گے کیونکہ وہ مختلف میموری سیلز میں ہیں اور equals() آپریشن کا نتیجہ غلط ہوگا۔

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 ہندسوں کے دو نمبر ہیش کوڈز ہیں۔ کیا ہوگا اگر ہم مساوی اشیاء رکھنا چاہتے ہیں اگر ان کے ایک جیسے نام ہوں؟ ہمیں کیا کرنا چاہئے؟ جواب: ہمیں اپنی کریکٹر کلاس کے لیے آبجیکٹ کلاس کے hashCode() اور equals() طریقوں کو اوور رائڈ کرنا چاہیے۔ ہم اسے 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 گنا زیادہ وقت لگتا ہے۔ جاوا میں ہیشنگ کا اصول کچھ مشہور مجموعوں کے پیچھے کھڑا ہے، جیسے HashMap ، HashSet اور HashTable ۔

نتیجہ

ہر جاوا آبجیکٹ میں آبجیکٹ کلاس سے وراثت میں ہیش کوڈ () اور برابر () طریقے ہوتے ہیں۔ ایک اچھا کام کرنے والی مساوات کا طریقہ کار حاصل کرنے کے لیے، آپ اپنی کلاسوں کے لیے hashcode() اور equals() طریقوں کو بہتر طور پر اوور رائیڈ کریں گے۔ ہیش کوڈز کے استعمال سے پروگرام تیزی سے چلتے ہیں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION