mIRC Script

mIRC Hash Tabloları: Hızlı Veri Saklama ve Arama

· Güncelleme: · 5 dk okuma

mIRC Hash Tabloları: Hızlı Veri Saklama ve Arama
İçindekiler
  1. Hash Tablosu Nedir?
  2. Tablo Oluşturmak ve Kapatmak
  3. Kayıt Eklemek ve Okumak
  4. Süreli Kayıtlar
  5. Kayıt Silmek
  6. Tabloda Gezinmek
  7. Arama
  8. Dosyaya Kaydetmek ve Yüklemek
  9. Çoklu Değer Saklamak
  10. Bellek Yönetimi
  11. Değişken mi, Hash mi, Dosya mı?
  12. Gerçek Bir Senaryo
  13. Sonuç

Scriptiniz büyüdükçe veri saklama ihtiyacı da büyür: Kanaldaki her kullanıcının mesaj sayısı, kim ne zaman görüldü, kullanıcıların puanları, yasaklı kelimelerin listesi. Bu verileri global değişkenlerde tutmak küçük ölçekte işe yarar, ama kayıt sayısı arttığında hem yavaşlar hem de kodunuz okunamaz hâle gelir. mIRC hash tabloları, bu iş için tasarlanmış doğru araçtır: Anahtar ve değer çiftlerini bellekte tutar ve arama işlemleri kayıt sayısından neredeyse bağımsız olarak hızlıdır.

Hash Tablosu Nedir?

Hash tablosu, her kaydın bir anahtarla erişildiği bir veri deposudur. Örneğin anahtar bir kullanıcının nicki, değer ise o kullanıcının puanı olabilir. Anahtarı verdiğinizde değer anında bulunur; tablonun on kayıt mı on bin kayıt mı içerdiği fark etmez.

Bu, token listeleriyle en belirgin farktır: Bir token listesinde arama yaparken metnin tamamı taranır; hash tablosunda ise doğrudan erişim sağlanır.

Tablo Oluşturmak ve Kapatmak

hmake puanlar 100
hfree puanlar

hmake komutunun ikinci parametresi, tablonun iç yapısının boyutudur. Bu sayı bellekte ayrılacak alanı etkiler; beklediğiniz kayıt sayısına yakın bir değer vermek performans açısından iyidir, ama tam olması gerekmez. Küçük tablolar için 10, orta boy için 100, büyük tablolar için 1000 makul başlangıç değerleridir.

hfree tabloyu bellekten siler. Bir tabloyu silmeden yeniden oluşturmaya çalışmak hata verir; bu yüzden tablo oluşturmadan önce varlığını kontrol etmek iyi bir alışkanlıktır:

if (!$hget(puanlar)) { hmake puanlar 100 }

Kayıt Eklemek ve Okumak

hadd puanlar Ayse 10
hadd puanlar Burak 7
//echo -a Ayse nin puani: $hget(puanlar,Ayse)

Aynı anahtara yeniden ekleme yaparsanız değer güncellenir. Bu, sayaç tutmak için kullanışlıdır:

hadd puanlar $nick $calc($hget(puanlar,$nick) + 1)

Var olmayan bir anahtarı okuduğunuzda boş değer döner; $calc boş değeri sıfır gibi işlediği için bu kalıp ilk kayıtta da doğru çalışır.

Süreli Kayıtlar

hadd komutu, kayda bir ömür vermenizi sağlar. Belirtilen süre sonunda kayıt kendiliğinden silinir. Bu özellik, geçici veriler için çok kullanışlıdır: Flood koruması, geçici kilit kayıtları, kısa süreli önbellekler. Süreli kayıtlar sayesinde temizlik kodu yazmak zorunda kalmazsınız.

Kayıt Silmek

hdel puanlar Ayse
hdel -w puanlar ayse*

Joker karakterli silme, bir gruba ait bütün kayıtları temizlemek için kullanışlıdır. Örneğin anahtarlarınızı "kanal.nick" biçiminde oluşturduysanız, bir kanala ait bütün kayıtları tek komutla silebilirsiniz.

Tabloda Gezinmek

Hash tablosunun bütün kayıtlarını dolaşmak için sıra numarasıyla erişim kullanılır:

var %i = 1
while (%i <= $hget(puanlar,0).item) {
  echo -a $hget(puanlar,%i).item : $hget(puanlar,%i).data
  inc %i
}

.item anahtarı, .data ise değeri verir. Sıfır parametresi toplam kayıt sayısını döndürür.

Önemli bir not: Hash tablosundaki kayıtların sırası, ekleme sırasıyla aynı olmayabilir. Sıralı bir çıktı istiyorsanız kayıtları bir listeye toplayıp sıralamanız gerekir. Sıralama için token identifier'larından yararlanabilirsiniz; bkz. mIRC token identifierları.

Arama

//echo -a $hfind(puanlar,ayse*,1,w).item
//echo -a $hfind(puanlar,10,0,n).data

$hfind, anahtarlar veya değerler içinde arama yapar. Parametreler arama türünü belirler: joker karakterli eşleşme, normal ifade veya tam eşleşme. Sıfır parametresi eşleşme sayısını verir.

Dosyaya Kaydetmek ve Yüklemek

Hash tabloları bellekte tutulur ve mIRC kapandığında kaybolur. Kalıcı olması gereken veriler için tabloyu dosyaya kaydetmeniz gerekir:

hsave -o puanlar puanlar.hsh
hload -i puanlar puanlar.hsh

Parametreler kaydetme ve yükleme biçimini belirler: Düz metin, ini biçimi veya ikili biçim seçenekleri vardır. Düz metin biçimi, dosyayı elle inceleyebilmenizi sağlar; ini biçimi ise bölümlü yapı sunar.

Verilerinizin kaybolmaması için iki noktada kaydetme yapmanız önerilir: Düzenli aralıklarla bir zamanlayıcıyla ve mIRC kapanırken. Zamanlayıcılar için mIRC timer yazımıza bakın.

on *:EXIT: {
  if ($hget(puanlar)) { hsave -o puanlar puanlar.hsh }
}

on *:START: {
  hmake puanlar 100
  if ($isfile(puanlar.hsh)) { hload -i puanlar puanlar.hsh }
}

START ve EXIT olayları, mIRC açılışında ve kapanışında çalışır; hash tablolarının yaşam döngüsünü yönetmenin doğal yeridir. Remote eventler için mIRC remote eventler yazımıza bakın.

Çoklu Değer Saklamak

Bir anahtara birden fazla bilgi bağlamanız gerekiyorsa, değerleri bir ayırıcıyla birleştirip tek değer olarak saklayabilirsiniz. Okurken token identifier'larıyla ayırırsınız. Örneğin bir kullanıcı için son görülme zamanı, son bulunduğu kanal ve son mesajı tek değerde tutulabilir.

Bu yaklaşımda ayırıcı seçimi önemlidir: Ayırıcının saklanan verilerde geçmemesi gerekir. Mesaj metni saklıyorsanız boşluk ve virgül uygun olmaz; nadir kullanılan bir karakter seçmek daha güvenlidir.

Alternatif olarak her bilgi türü için ayrı bir tablo kullanabilirsiniz. Bu yaklaşım daha fazla tablo yönetmeyi gerektirir ama kodu okunabilir tutar.

Bellek Yönetimi

Hash tabloları bellekte yer kaplar. Binlerce kayıtlı birkaç tablo normal kullanımda sorun yaratmaz, ancak dikkat edilmesi gereken noktalar vardır:

  • Gereksiz tabloları kapatın: Artık kullanılmayan tabloları hfree ile serbest bırakın.
  • Eski kayıtları temizleyin: Geçici veriler için süreli kayıtlar kullanın veya düzenli temizlik yapın.
  • Tablo boyutunu makul tutun: Kayıt sayınızın kat kat üstünde bir boyut vermek bellek israfıdır.
  • Scripti kaldırırken temizleyin: Scriptinizi kaldıran kullanıcı, tablolarınızın bellekte kalmasını istemez.

Değişken mi, Hash mi, Dosya mı?

İhtiyaçUygun araç
Birkaç ayar değeriGlobal değişken
Geçici hesaplamaYerel değişken
Kısa liste (birkaç düzine)Token listesi
Çok kayıt, sık aramaHash tablosu
Bölümlü yapılandırmaIni dosyası
Satır satır büyüyen kayıtMetin dosyası

Ini dosyaları için mIRC ini dosyaları, metin dosyaları için mIRC dosya işlemleri yazılarımıza bakın.

Gerçek Bir Senaryo

Bir kullanıcı, kanalında bir "seen" sistemi yazıyor: Kim ne zaman en son görüldü. İlk sürümde her kullanıcı için bir global değişken oluşturuyor. Kanal kalabalık olduğu için üç ayda beş binden fazla değişken birikiyor ve mIRC açılışı yavaşlıyor. Kullanıcı sistemi hash tablosuna taşıyor: Tek bir tablo, anahtar olarak nick, değer olarak zaman ve son işlem bilgisi. Verileri on dakikada bir dosyaya kaydediyor ve açılışta yüklüyor. Hem mIRC açılışı hızlanıyor hem de script kodu belirgin şekilde kısalıyor.

Sonuç

Hash tabloları, mIRC'te ciddi veri saklamanın doğru yoludur. Tabloyu oluştururken varlığını kontrol edin, kayıtları anahtarla ekleyip okuyun, geçici veriler için süreli kayıtlar kullanın, kalıcı veriler için düzenli olarak dosyaya kaydedin ve kullanılmayan tabloları serbest bırakın. Yapılandırma verileri için sıradaki rehberimiz mIRC ini dosyaları.

IRC sorunun mu var? Kanalda birlikte çözelim.

💬 Kanala Bağlan

Sıkça Sorulan Sorular

Hash tablosu nedir?

Anahtar ve değer çiftlerini bellekte tutan, arama işlemleri çok hızlı olan bir veri yapısıdır.

Hash tablosu mIRC kapanınca kaybolur mu?

Evet. Bellekte tutulur. Kalıcı olması için hsave ile dosyaya kaydedip açılışta hload ile yüklemeniz gerekir.

Kaç kayıt saklayabilirim?

Pratikte bellek kapasiteniz sınırdır. Binlerce, hatta on binlerce kayıt rahatlıkla tutulabilir.