Konu: Hash Tables
Tekil Mesaj gösterimi
Alt 20 Kasım 2005, 01:29   #1
Utku
Guest
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Yüzdesi:(%)
Hash Tables




Yazar : Ben tabii ki
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.

Kalite kontrol uzmanı ve onaylayan (:p) : Alience

Öncelikle hash table nedir onu açyklamaya çalışayım, Hash table'lar bildiğiniz ini belgesine veri kaydetme yöntemine benzer. Fakat hash işlemleri hafızada(ram) yapıldığı için hdd(hard disk) işlemlerine göre çok daha hızlıdır, ama komple bir scriptte aşırı derecede kullanılıp hafızayı doldurmaya başlarsak bu avantajıda ortadan kaldırırız.

Table oluşturma /hmake:
/hmake -s <tabloismi> <slot sayısı>
Hash tablosu oluşturmak için komutumuz bu. Hash table slot ve değerlerden oluşur. Her slota istediğiniz kadar değer yerleştirebilirsiniz, fakat slot sayısını komutta önceden belirlemeniz gerekiyor. Yani 10 tane slot bile oluştursak, 1000 tane değer kaydetmemiz mümkün, çünkü slotlar sınırsız değer alabilirler. Fakat slot başına düşen değer sayısının az olması için slot sayısını fazla tutmak mIRC'i daha az kasar ve daha kısa sürede işlem yapmasını sağlar.
Komuttaki -s anahtarı ise hash table'ın oluşup oluşmadığına dair bir bilgi vermesi içindir. Onu yazmadan da komut çalışır, fakat hash table oluştu mu oluşmadı mı diye merakta kalmak istemiyorsanız -s koymalısınız. Örneğin:

/hmake -s asd 10
komutunu yazdığınızda:
* Made hash table 'asd' (10)
diye bir uyarı gelir, bu da işlem başarıyla tamamlandı demektir. -s koymazsanız bu uyarı gelmez.

Table silme /hfree:
Oluşturduğumuz tabloyu silmek için ise /hfree komutunu kullanacağız. Komutun kullanımı şu şekilde:
/hfree -sw <tabloismi>
Buradaki s parametresinin görevi aynı, w ise wildcard (* ve ? gibi işaretler) kullanmamıza olanak sağlıyor. Örneğin a.1 a.2 a.3 diye 3 tane tablomuz var ve bunların hepsini bir kerede silmek istiyoruz. O halde:
/hfree -sw a.*
komutunu kullanırsak, a. ile başlayan tüm tablolar silinir. Sadece belirli bir tabloyu silmek için:
/hfree -s a.1

Table'ye ekleme /hadd:
/hadd -smzuN <tabloismi> <slot> değer
Bu komutu tabloya değer eklemek için kullanıyoruz. Komuttaki &quot;smzuN&quot; parametrelerinin görevleri ise şöyle:
-s yukarıda da bahsettiğim gibi işlemin tamamlanıp tamamlanmadığı hakkında uyarı verir.
-m eğer isim yerine yazdığımız tablo daha önce oluşturulmadıysa şimdi oluşturur.
-u değerin kaç saniye boyunca geçerli olacağını belirtir, ve yanındaki N de saniye yerine yazılır. Örneğin -u10 yazdığımızda 10 saniye sonra değer slottan silinir.
-z değeri saniyede 1 değer küçülterek 0'a kadar indirir ve 0 olduğunda değeri siler. Yani bir nevi inc komutundaki -c parametresini burada bu şekilde kullanıyoruz. Onun dışında saniyelik değil de manual olarak düşürmek veya yükseltmek için /hinc ve /hdec komutlarını kullanabilirsiniz. inc ve dec komutlarından pek bir farkı yok. Örneğin:

Table'de bir değeri artırma /hinc:
/hinc <tabloismi> <değer> <arttırma miktarı>
/hinc -s asd x (burada asd tablosundaki x'i sadece 1 artırır)
veya
/hinc -s asd x 15 (asd tablosundaki x değerini 15 artırır)

* Inc item 'x' in hash table 'asd'
Bunun dışındaki parametreler için help dosyasına bakabilirsiniz. Fakat yeni başlayanlar için şimdilik öğrenmemelerini tavsiye ederim <img src="images/smilies/smile.gif" border="0" alt="" title="Smile" class="inlineimg" />, ayrıca -s parametresini yukarıda da belirtilmiş olduğu gibi yazmanıza gerek yok ama şu anda öğrenme aşamasında olduğunuz için ne yapıldığını görmeniz açısından yazılmıştır.
Table'de bir değeri azaltma /hdec:[/b]
/hinc in aynısı tek farkı artırmıyor azaltıyor.
örnek: /hdec -s asd x 3 (asd tablosundaki x değerini 3 azaltır)

Table'den değer silmek /hdel:
/hdel -sw <tabloismi> <değer>
Buradaki w parametresi yine wildcard kullandığınızı belirtiyor. Eğer belirli bir değeri silecekseniz:
/hdel -s tablo1 deger1
Eğer deger ile başlayan 10 tane değeriniz varsa ve hepsini birlikte silmek istiyorsanız:
/hdel -sw tablo1 deger*
komutunu kullanacaksınız. Bu komut ile deger1 deger2 deger3 degeraaaddd gibi bütün değerler silinir.
Şimdi oluşturduğumuz hash tablolarını kaydetmeye ve yüklemeye gelelim. Eğer oluşturduğunuz tabloyu kaydetmezseniz mIRC kapandığında tablo silinir. Hatta tablonuzu kaydedip başkasına yollayıp hload komutu ile onun da kullanmasını sağlayabilirsiniz.

Table'yi hdd'den yükleme /hload:
Bir hash oluşturduk çokta iyi gidiyoruz ama bu meret ini dosyası gibi kaydolmuyor mirc kapanınca gidiyor diyorsanız /hload, /hsave kullanmanız gerekli, yok ben kendim $hget ile değerleri bulup kaydettirecem diyorsanız oda mümkün ama hem zaman alır hemde uğraştırır sizi.
/hload -sni <tabloismi> <dosyaismi>

Table'yi hdd'ye kaydetme /hsave:
/hsave -snioau <tabloismi> <dosyaismi>

/hload, /hsave parametreleri:
-s yine uyarılar için kullanılıyor.
-n sadece tablodaki slotları kaydeder/yükler, değerleri kaydetmez/yüklemez.
-i kaydedeceğimiz/yükleyeceğimiz dosyanın ini dosyası olduğunu belirtir..
-o kaydedeceğiniz dosya varsa üstüne yazmak istediğinizi belirtir.
-a kaydedeceğiniz dosya var ise dosyanın üstüne eklemek istediğinizi belirtir.
-u ise tabloya eklerken belirli bir süre sonra silinecek (-uN) değerlerle birlikte dosyaya kaydedilmesini sağlar. Normalde kaydettiğinizde
-uN ile eklediğiniz değerler süresi dolmuş olsa da olmasa da dosyaya kaydedilmez.

Table okuma $hget():
$hget(isim/numara)
Eğer varsa ismini veya sıra numarasını yazdığımız tablonun ismini verir. Bununla tablonun olup olmadığını kontrol ettiririz. Örneğin:
$hget(1) ilk tablonun ismini verir, eğer $hget(0) yazar iseniz kaçtane hash tablosu olduğunu görürsünüz.
Bununla birlikte .size parametresini kullanarak tablonun kaç slottan oluştuğunu öğrenebiliriz.
Örneğin:
/hmake tablo1 10
komutu ile bir tablo oluşturduk.
$hget(1) = tablo1
$hget(1).size = 10
cevaplarını verir. Eğer tablo yok ise:
$hget(1) = $null
$hget(1).size = 0
cevaplarını verir.


Table'deki değerleri okutma $hget(Table,değer):
$hget(isim/numara,değer)
Bu identifier ise verdiğiniz numaralı sıradaki tablodaki değerin karşılığını verir. Örneğin:
/hmake tablo1 10
10 slotlu tablo1 adında bir tablo oluşturduk.
/hadd -u10 tablo1 kanallar #a #b #c
Kanallar slotu ekledik ve buna değer olarak #a #b #c verdik, ve bu değerlerin 10 saniye sonra silinmesini istedik.
bu durumda 2 seçeneğimiz var. Eğer tablo ve slot numaralarını biliyorsak bu şekilde:
$hget(1,1).data = #a #b #c
eğer bilmiyorsak bu şekilde:
$hget(tablo1,kanallar) = #a #b #c
cevaplarını alabiliriz.
.data kullanmak için mutlaka slot numarasını bilmemiz gerekir.
.item ise slot numarasının kaç olduğunu öğrenmek için kullanılır. Örneğin tek slotunuz varsa ve bunun adı kanallar ise:
$hget(tablo1,kanallar).item = 1
cevabını verir.
.unset parametresi ise değerlerin ne zaman silineceğini, yani -uN ile belirttiğimiz sürenin bitmesine ne kadar kaldığını görmemize yarar.
10 saniyelik oluşturduğumuz bu tabloda uygularsak:
$hget(tablo1,kanallar).unset = 10
olmayan bir tablo üzerinde denersek veya süre belirtilmemiş bir tablo üzerinde denersek 0 cevabını alırız.

Table'de arama yapmak $hfind():
$hget(isim/numara,aranacak yazı,kaçıncı item,parametre)
parametre yerine nwWrR yazabilirsiniz ama benim tavsiyem bir şey yazmamanız böylece mirc default olarak n görecektir buda normal yazı karşılaştırmasıdır.

Alience'nin notu:
Hash table'lerinin tümünü görmek için aşağıdaki kodu aliasese ekleyin

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
/hlist { var %i = $hget(0) if %i { echo $color(info text) -at Hash list gösteriliyor toplam %i kadar tablo var! | echo -a $chr(160) } else { echo $color(info text) -at Hiçbir hash tablosu yok! | halt } while %i { var %x = $hget(%i,0).item echo $color(info2 text) -at $hget(%i) $iif($regex($1,^-i$),boyutu: $hget(%i).size kullanılan: %x) while %x { echo $color(info2 text) -at $str($chr(160),3) $hget(%i,%x).item = $hget(%i,%x).data dec %x 1 } echo -a $chr(160) dec %i 1 } echo $color(info text) -at Hlist bitti }

ve ekledikten sonra komut olarak /hlist yazarsanız hash listesini görürsünüz /hlist -i ekstra boyutu: 10 kullanılan: 1 gibisinden açıklama içindir, kodu sizi bilgilendirmesi açısından yazdım istediğiniz gibi değiştirebilirsiniz.

 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları eglen sohbet reklamver