- Published on
Swiftda Hashable
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Swiftda Hashable β bu obyektimizga hashValue beruvchi protocol. hashValue ikki instanceni solishtirish uchun ishlatiladi.
hashValue dan foydalanish uchun avval turni (struct, class va hokazo) Hashable protocoliga moslashtirish kerak. Masalan,
struct Employee: Hashable {
...
}
Bu yerda Employee structini Hashable protocoliga moslashtirdik.
Endi Employee dan instancelar yaratganimizda, protocol instancelarga hash qiymatlarini beradi.
Misol:
struct Employee: Hashable {
var name: String // ism
}
let object1 = Employee(name: "Sabby")
let object2 = Employee(name: "Smith")
// hash qiymatlarini chop etish
print(object1.hashValue)
print(object2.hashValue)
Natija:
754256748862435114
-6408043519205941253
Bu yerda object1.hashValue va object2.hashValue mos ravishda object1 va object2 instancelari uchun hash qiymatlarini qaytaradi.
Hash qiymati β bu uzoq butun son bo'lib, siz ishlatayotgan tizimga qarab o'zgaradi, shuning uchun bir xil kod uchun boshqa qiymatlarni olishingiz mumkin.
Hashable protocol yordamida Instancelarni solishtirish
// Employee ni Hashable ga moslashtirish
struct Employee: Hashable {
var name: String // ism
var salary: Int // maosh
}
// turli property qiymatlari bilan ikkita obyekt yaratish
let obj1 = Employee(name: "Sabby", salary: 40000)
let obj2 = Employee(name: "Cathy", salary: 30000)
print("Turli hash qiymat: ")
print(obj1.hashValue)
print(obj2.hashValue)
// bir xil property qiymatlari bilan ikkita obyekt yaratish
let obj3 = Employee(name: "Lanny", salary: 50000)
let obj4 = Employee(name: "Lanny", salary: 50000)
print("\nBir xil hash qiymat: ")
print(obj3.hashValue)
print(obj4.hashValue)
Natija:
Turli hash qiymat:
3934953678767833906
4997634560615333199
Bir xil hash qiymat:
1588129438168529318
1588129438168529318
Yuqoridagi misolda Hashable protocoliga mos keladigan Employee nomli struct yaratdik.
Ikkita obyekt yaratdik: obj1 va obj2.
let obj1 = Employee(name: "Sabby", salary: 40000)
let obj2 = Employee(name: "Cathy", salary: 30000)
Bu yerda ikkala instance ham name va salary propertylari uchun turli qiymatlarga ega. Shuning uchun obj1 va obj2 uchun hash qiymatlari turlicha.
Xuddi shunday, yana ikkita obyekt yaratdik.
let obj3 = Employee(name: "Lanny", salary: 50000)
let obj4 = Employee(name: "Lanny", salary: 50000)
Bu safar obj3 va obj4 ning property qiymatlari bir xil, shuning uchun instancelar uchun bir xil hash qiymatlarini olamiz.
Hash funksiya va Combine
Yuqoridagi misolda structning barcha propertylarini solishtirib chiqdik.
Ammo ba'zan turning faqat ayrim propertylarini solishtirishni xohlashimiz mumkin. Bunday holatda tur ichida hash funksiyasidan foydalanishimiz mumkin. Masalan,
func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
Bu yerda hash() funksiyasi solishtirishni xohlagan propertyni belgilash uchun hasher.combine() dan foydalanadi.
Hash funksiyadan foydalanish
struct Employee: Hashable {
var name: String // ism
var salary: Int // maosh
// faqat salary propertyni solishtirish uchun hash() funksiyasini yaratish
func hash(into hasher: inout Hasher) {
hasher.combine(salary)
}
}
// salary property uchun turli qiymatlarga ega ikkita obyekt yaratish
let obj1 = Employee(name: "Sabby", salary: 349879)
let obj2 = Employee(name: "Sabby", salary: 422532)
print(obj1.hashValue)
print(obj2.hashValue)
Natija:
3932232896576771782
743881919875172951
Yuqoridagi misolda ikki instanceni salary propertysi asosida solishtirish uchun hash() funksiyasidan foydalandik:
func hash(into hasher: inout Hasher) {
hasher.combine(salary)
}
Bu yerda obj1 va obj2 ning salary si turlicha, shuning uchun turli hash qiymatlarini olamiz.
Agar hash() funksiyasi ichida name propertydan foydalansak, bir xil hash qiymatni olamiz. Buning sababi, ikkala obyektning name i bir xil.
func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
// Natija:
// 976332112043722041
// 976332112043722041
Xulosa
Hashable protocoli:
- Obyektlarga hash qiymatlarini beradi
- Instancelarni samarali solishtirish imkonini beradi
hash()funksiyasi orqali ayrim propertylarni tanlash imkonini beradi- Dictionary kalitlari va Set elementlari uchun zarur
Hashable protocoli Swiftda ma'lumotlar tuzilmalarini samarali boshqarish uchun muhim vositadir.