PHP ile tekil anahtar oluşturmak

Dikkat: Bu yazının yazılma tarihinin üzerinden en az 60 gün geçmiş. İçerisindeki bilgiler güncelliğini yitirmiş olabilir. Yorumları ve güncellemeleri göz önünde bulundurarak yazıyı takip ediniz.
Türkçesini çok bulamadığım hash kelimesini anahtar olarak kullanacağım. Burada aslında bahsettiğim anahtar herhangi bir veri grubunuza atadığınız, sayısal olmayan kimliklerden bahsediyorum. Yani rasgele üretilmiş belirli bir uzunlukta olan kimlikleri her yerde kullanıyoruz.

Neden sayısal bir kimlik kullanmak yerine bu anahtarlara ihtiyaç duyacağınızı en açık şekilde şöyle anlatabilirim. Mesela tahmin ederek erişilmesini istemeyeceğiniz ama şifre veya kullanıcı girişi gibi herhangi bir sınırlama koyamayacağınız bir sayfanız var, örnek veriyorum yapılacak işler listesi veritabanı oluşturuyorsunuz ve her kayıt bir yapılacak iş listesi. Veritabanında sayısal bir kimliğe yani numaraya sahip bu kayıtlar. Hazırladığınız bir php sayfası da liste numarasına göre yapılacak iş listesinin detayını ekrana döküyor.

Eğer liste_detay.php?no=145 gibi basit bir şekilde tutarsanız url'i oynayarak başkalarının listelerine erişebilir, sadece erişmek değil sistemdeki tüm listeleri basit bir script ile tahmin edebilir veya tarayıp kaydedebiliriz. Böyle bir durumda listelerinizi sadece sayısal değil, tahmin edilemeyecek bir anahtar ile (örneğin: t34de6gx) tanımlamak istiyorsunuz.

Bu noktada rastgele bir anahtar üretebilirsiniz, bunu yapmak çok zor değil. PHP'deki rasgele sayı üretme fonksiyonunu kullanarak ve bir karakter dizisinden rastgele elemanlar çekerek bir kelime üretebilirsiniz.

Bunu daha pratik bir şekilde tek satırda bile yapabilirsiniz:
$anahtar = substr(str_shuffle('abcdefghklmnoprstuvyzqxw1234567890'), 0, 6);
Bu satır size 6 karakterlik bir kelime üretecektir. Basitçe str_shuffle fonksiyonu ile özel karakter içermeyen ve rakamlarında dahil olduğu bir alfabeyi karıştırıyor ve başındaki ilk 6 karakteri alıyoruz.

Şimdi bu, işin basit kısmı. Eğer veritabanındaki bir veri set için bu anahtarı oluşturuyorsanız üretilen anahtarın veri setinde daha önce kullanılıp kullanılmadığını test etmek zorundasınız. Sonuçta tekil bir anahtar oluşturuyorsunuz. Bu arada veri setiniz mysql veya bir sql veritabanında olmak zorunda değil, bir xml, csv veya txt dosyasında saklı olan bir set için de benzer şeyi uygulayabilirsiniz.

Veritabanındaki veriyi test ederek bir anahtar oluşturmanın en kısa ve basit kodu şöyle:
do {
    $anahtar = substr(str_shuffle('abcdefghklmnoprstuvyzqxw1234567890'), 0, 6);

    $query = mysql_query("SELECT no FROM listeler 
        WHERE anahtar LIKE '" . $anahtar . "'");
} while (mysql_num_rows($query) > 0);

print $anahtar;
Bu kod, veritabanında olmayan bir anahtar üretmenizi sağlayacaktır. Sonra verinizi hazırlayıp tablonuza yeni kayıdınızı ekleyebilirsiniz.


Hazırlayan: Mehmet Fatih YILDIZ

Yorumlar

Üye Resmi Janberk Arıkan
19 Temmuz Perşembe ´12 23:48
PHP'de zaten uniqid isimli bir fonksiyon var bunun kullanmamanızın sebebi nedir?
20 Temmuz Cuma ´12 00:56
Evet uniqid de kullanabilirsin ama yazinin asil noktasi string olarak anahtari uretebilmek degil, uretilen anahtarin bir veri seti icinde unique olup olmadigini test etmekte.

Evet uniqid tekil bir sonuc verebilir fakat en az 13 karakterlik bir sonuc uretecektir. Yazida daha kisa bir hash ile cozmek istediginizde nasil bir method izleyebileceginiz var. Yani 4-5 karakterlik bir anahtardan bahsediyorum. Ornek olarak url kisaltma servisleri dusunulebilir.
20 Temmuz Cuma ´12 06:56
Merhaba,

do {
$anahtar = substr(uniqid()), 0, 6);
$query = mysql_query("SELECT no FROM listeler
WHERE anahtar LIKE '" . $anahtar . "'");
} while (mysql_num_rows($query) > 0);
print $anahtar;

şeklinde kullanmaktan bahsediyordum ben işin aslı. Benchmark falan yapma fırsatım olmadı yalnız daha olur gibi geldi   :-)
20 Temmuz Cuma ´12 08:29
Evet daha efektif bir cozum.
Üye Resmi oğuz
9 Ekim Salı ´12 07:06
mfyz teşekkür ederim
Üye Resmi mert türk
19 Aralık Cumartesi ´15 14:03
Arkadaslar Ben Böyle Kod Üretmek İçin Ne Yapmalıyım
2dd336ac-fe0f-4b1c-be1f-ee9167eb394d

b0d07ffe-ff62-4034-88f3-706809101607

48662936-5006-46f3-92a8-0d6a21ea7e2f

15bdbb58-a3f9-4155-98f7-876bd91d904b

d572d2c6-9afc-4cfb-b920-0d9b9457d2d3

512fe658-3d77-43e9-bd5f-ff6852be8cc7

13acc9a2-d44b-4f97-aed8-bc97e4480599

73381297-f833-460d-a693-9539e2cb9a37

947c47a9-e7d2-45f2-bcdf-360d80328602

215ec410-5158-4b24-8d76-1ecad6c66ae1

Yardımcı olursanız sevınırım
Üye Resmi Erman Ak
26 Mayıs Cuma ´17 13:48
Harika bir yazı alışkanlık olarak türkçesi olmaz diye araştırdım doğru kelimeleri yazamadım sanırım. Bide türkçe arayayım dedim siz çıktınız. Çok teşekkür ederim inanılmaz işimi çözdü bu kısa kod parçacığı
Yeni Yorum *
İletişim Bilgileri
*
*
E-Posta adresiniz gösterilmeyecektir.
(unut)
Güvenlik Kodu *

Gönderiliyor