هاش جو اصول

سڀ کان پهريان، اسان جاوا هيش ڪوڊ جي وضاحت ڪرڻ کان اڳ، اسان کي سمجهڻ جي ضرورت آهي ته هيشنگ ڇا آهي ۽ اهو ڇا لاء آهي. هشنگ ڪجهه ڊيٽا تي هش فنڪشن لاڳو ڪرڻ جو هڪ عمل آهي. هيش فنڪشن صرف هڪ رياضياتي فنڪشن آهي. هن جي باري ۾ پريشان نه ڪريو! "رياضياتي" جو مطلب هميشه "پيچيده" نه آهي. هتي ان جو مطلب صرف اهو آهي ته اسان وٽ ڪجهه ڊيٽا ۽ هڪ خاص قاعدو آهي جيڪو ڊيٽا کي نقشي جي هڪ سيٽ (ڪوڊ) ۾ ٺاهي ٿو. مثال طور، اهو ٿي سگهي ٿو هيڪساڊيڪل سيفر. اسان وٽ ان پٽ تي ڪنهن به سائيز جي ڪجهه ڊيٽا آهي، ۽ ان تي هڪ هش فنڪشن لاڳو ڪريو. ٻاھر نڪرڻ تي، اسان ھڪڙي مقرر ٿيل ڊيٽا حاصل ڪندا آھيون، چون ٿا، 32 اکر. عام طور تي، اهڙي قسم جي فنڪشن کي ڊيٽا جي هڪ وڏي ٽڪري کي ننڍي انٽيجر جي قيمت ۾ تبديل ڪري ٿو. هن فنڪشن جي ڪم جي نتيجي کي هيش ڪوڊ سڏيو ويندو آهي. هيش فنڪشن وڏي پيماني تي استعمال ٿيل آهن cryptography، ۽ ڪجهه ٻين علائقن ۾ پڻ. Hash افعال مختلف ٿي سگهن ٿا، پر انهن سڀني کي ڪجهه خاصيتون آهن:
  • هڪ خاص اعتراض هڪ خاص hashcode آهي.
  • جيڪڏهن ٻه شيون برابر آهن، انهن جا هيش ڪوڊ ساڳيا آهن. ريورس سچ نه آهي.
  • جيڪڏهن هيش ڪوڊ مختلف آهن، پوء شيون پڪ سان برابر نه آهن.
  • مختلف شيون شايد ساڳيا هيش ڪوڊ هجن. تنهن هوندي به، اهو هڪ انتهائي غير ممڪن واقعو آهي. هن موقعي تي، اسان وٽ هڪ ٽڪر آهي، هڪ صورتحال، جتي اسان ڊيٽا وڃائي سگهون ٿا.
"مناسب" هش فنڪشن ٽڪرن جي امڪان کي گھٽائي ٿو.

جاوا ۾ Hashcode

جاوا ۾ هيش فنڪشن عام طور تي hashCode() طريقي سان ڳنڍيل آهي . خاص طور تي، هڪ اعتراض تي هش فنڪشن لاڳو ڪرڻ جو نتيجو هڪ هيش ڪوڊ آهي. هر جاوا اعتراض وٽ هيش ڪوڊ آهي. عام طور تي Hash Code ھڪڙو انگ آھي جيڪو ڪلاس جي 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() جو طريقو لاڳو ڪرڻ

مثال

اچو ته ھڪڙي فيلڊ سان ھڪڙو ڪلاس ڪردار ٺاھيو - نالو . ان کان پوء، اسان ٻه شيون ٺاهيندا آهيون Character class، character1 ، ۽ character2 ۽ انهن کي ساڳيو نالو سيٽ ڪريو. جيڪڏهن اسان آبجیکٹ ڪلاس جي ڊفالٽ hashCode() ۽ equals() استعمال ڪريون ٿا، ته اسان کي ضرور مختلف ملنداسين، برابر شيون نه، اهڙي طرح جاوا ۾ hashcode ڪم ڪندو آهي. انهن وٽ مختلف هيش ڪوڊس هوندا ڇو ته اهي مختلف ميموري سيلن ۾ آهن ۽ 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() طريقن جي Object class جي اسان جي ڪردار ڪلاس لاءِ . اسان اهو خود بخود IDEA IDE ۾ ڪري سگهون ٿا، صرف پريس ڪريو alt + insert پنهنجي ڪيبورڊ تي ۽ چونڊيو Generate -> equals() ۽ hashCode() . جاوا ڇا آهي 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
تنهن ڪري هاڻي پروگرام اسان جي شين کي برابر طور سڃاڻي ٿو ۽ انهن وٽ ساڳيا هيش ڪوڊ آهن.

Java hashcode مثال:

توهان جو پنهنجو هيش ڪوڊ () ۽ برابر ()

توهان پڻ ٺاهي سگهو ٿا پنهنجون برابر () ۽ hashCode() حقيقتون، پر محتاط رهو ۽ ياد رکو ته هيش ڪوڊ جي ٽڪرن کي گھٽ ڪرڻ لاءِ. هتي شاگردن جي طبقي ۾ اسان جي پنهنجي hashCode() ۽ equals() طريقن جو هڪ مثال آهي :
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));
   }
}

hashcode ڇا لاء استعمال ڪيو ويندو آهي؟

سڀ کان پهريان hashcodes پروگرامن کي تيز هلائڻ ۾ مدد ڪن ٿا. مثال طور، جيڪڏهن اسان ٻن شين جو مقابلو ڪيو o1۽ o2ڪجهه قسم جو، آپريشن o1.equals(o2)o1.hashCode() == o2.hashCode() جي ڀيٽ ۾ 20 ڀيرا وڌيڪ وقت وٺندو آهي. جاوا ۾ هيشنگ اصول ڪجهه مشهور مجموعن جي پويان بيٺل آهي، جهڙوڪ HashMap ، HashSet ۽ HashTable .

نتيجو

هر جاوا آبجیکٹ وٽ hashCode() ۽ equals() طريقا آبجیکٹ ڪلاس مان ورثي ۾ مليا آهن. سٺو ڪم ڪرڻ جي برابري واري ميڪانيزم حاصل ڪرڻ لاءِ، توھان بھتر آھيو override hashcode() and equals() طريقن پنھنجي پنھنجي ڪلاسن لاءِ. hashcodes استعمال ڪندي پروگرامن کي تيزيءَ سان هلائي ٿو.