ہیش کا اصول
سب سے پہلے، اس سے پہلے کہ ہم جاوا ہیش کوڈ کی وضاحت کریں، ہمیں یہ سمجھنا ہوگا کہ ہیشنگ کیا ہے اور یہ کس لیے ہے۔ ہیشنگ کچھ ڈیٹا پر ہیش فنکشن لگانے کا عمل ہے۔ ایک ہیش فنکشن صرف ایک ریاضیاتی فنکشن ہے۔ اس کے بارے میں فکر مت کرو! "ریاضی" کا مطلب ہمیشہ "پیچیدہ" نہیں ہوتا ہے۔ یہاں اس کا مطلب صرف یہ ہے کہ ہمارے پاس کچھ ڈیٹا اور ایک خاص اصول ہے جو ڈیٹا کو حروف کے ایک سیٹ (کوڈ) میں نقش کرتا ہے۔ مثال کے طور پر، یہ ایک ہیکساڈیسیمل سائفر ہو سکتا ہے۔ ہمارے پاس ان پٹ پر کسی بھی سائز کا کچھ ڈیٹا ہے، اور اس پر ہیش فنکشن لگاتے ہیں۔ آؤٹ پٹ پر، ہمیں 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() کو منتخب کریں ۔ ہماری مثال کے معاملے میں ہمیں اگلا کوڈ ملا ہے:
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;
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();
}
@Override
public int 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>();
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));
Student john = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28));
Student johnny = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28));
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() طریقوں کو بہتر طور پر اوور رائیڈ کریں گے۔ ہیش کوڈز کے استعمال سے پروگرام تیزی سے چلتے ہیں۔
GO TO FULL VERSION