lastwisher adlı üyeden alıntı:
mesajı görüntüle
Benzersiz kod üretme
22
●10.897
- 23-10-2013, 17:50:41Üyeliği durdurulduherkes ayrı ayrı alternatif sunmuş. forumdaki en iyi şekilde cevaplanan mesajalrdan biridir kesinlikle.bu konudaki tek gereksiz mesaj sizinki olsa gerek.lastwisher adlı üyeden alıntı: mesajı görüntüle
- 24-10-2013, 19:56:13Kimlik doğrulama veya yönetimden onay bekliyor.Üstadım ben bişey söylediğim zaman anlayın ki laf olsun diye konuşmuyorum.Arkasında dolu dolu deneyim var.Ben birşey söylediğimde php hakkında, iki çıkarım yapın. Birincisi doğrudur diyip kabul edebilirsiniz.İkincisi bu adam yanlış söylemiş olabilir araştırayım bakayım diyebilirsiniz."Yauw boş boş konuşmayalım dükkanın önünü kalabalık etmeyin" demek size sonuç getirmez.madly0011 adlı üyeden alıntı: mesajı görüntüle
Bu arada ironidir ki tek gereksiz mesaj diyerekten, sizin görüşünüz ile ikinci gereksiz mesajı yazmışsınız.
Ben uzman olduğum bir konuda görüşümü belirtiyorum. Bu konuda itirazınız var ise buyrun detayına inin konuşalım.
Şimdi neden benim boş yazmadığıma gelince madem ki öyle düşünüyorsunuz, bir bakalım.
Aşağıdaki yazdıklarımın hiçbirisini lütfen kimse kişiselleştirmesin, herkesin emeğine saygım var ama neden gereksiz dediğimi izzah etmek isterim.
Bunun mesela karşılığı aslında :Nietzsche adlı üyeden alıntı: mesajı görüntüle
$kod = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);Bunun dışında bunun unique olmama şansı var, % kaçtır derseniz 5 x karaktersayısı'nın karaktersayı katı kadardır. Çok küçük de olsa eğer programlamada gereği kadar deneyiminiz var ise, bunu riske atmazsınız. Sonra milyon satırın arasında bunu düşünmeniz saçları beyazlatır.
ps : alıntıdır.
function uniqerand($len = 7) { $word = array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9')); shuffle($word); return substr(implode($word), 0, $len); } echo 'ABC'.uniqerand();Bu mantıklı bir kod, fakat yukarıdaki argüman bunun içinde malesef geçerli bu unique bir sonuç değildir, unique olması tahmin edilen bir sonuçtur.
Bu tamamen yanlış, çok basitçe deneyebilirsiniz;BR9 adlı üyeden alıntı: mesajı görüntüle
for ($i =0; $i<=10;$i++) echo "$i - " . md5(time()) . "<br>";
Sonuç ;

Buradaki mantık bir milisaniyede birden fazla işlem olmaz ise geçerli olur fakat gösterdiğim gibi güvenilir yöntem değildir.
Bu çok çok daha mantıksal bir unique id, zaten unique id nin çalışma mantığına çok yakın birazdan anlatacağım. Bununda denk gelme olasılığı bir microsaniyede 9999/1.madly0011 adlı üyeden alıntı: mesajı görüntüle
Öncelikle belirteyim yukarıdakinlerin hiçbirisi yanlış olarak kabul edilmeye bilir, farklılık sizinle alakalıdır, ben kodumda milyarda bir bile şansa atmak istemem (mutlakaki yapıyorumdur bende yanlış ama bunun gibi konuları farkedersem düzeltirim)
Şimdi neden unique id gerçek cevap dedim ona gelelim.
Unique id nasıl çalışıyor ;
ps : Alıntıdır.Alıntı
Yani;
ilk 8 karakter micro time, float karşılının in hex karşılığıdır;
yani
$m=microtime(true);
$m = dechex($m);
$m = substr($m,0,8);
gibi (tersten)
bir micro time fload olarak "1382632819.6166" gibi sonuç döndürür.
yukarda arkadaşın yaptığı microtime orneğine çok yakın
Bunun yanına sonuna microtime ı komple fload olarak ekler ve bunu hex yapar.
Dolayısı ile bunun aynı gelme ihtimali yukarıda yazılan tüm değerlenden kat kat daha düşük(float to dec dex to bin x microsüre).
Benim gerisi gereksiz olmuş önerim buradan geliyordu.
Bunun dışında gerçek eşsiz bir id istiyorsan malesefki diğer opsionları kayıt ettirmekten başka şansın yok. Gerçek unique id başka şekilde elde edilemiyor.Bir field tutup onu arttırabilir oradaki değer üzerine fonksion yazabilirsin.
Bunun için ben daha önce rand değerler ve doğrusallık üzerine bişey yazmıştım. Türkiyedeki harddiskimde duruyor olsa şimdi bu yazıya güzel giderdi.
İncecik bir dipnot;
Konuya polimiğe dönüşecek bişey yerine, mesleği ileriye götürecek birşey söylemeyecekseniz lütfen zahmet etmeyin. Kimseye bir yararı yok. - 24-10-2013, 21:09:08Üyeliği durduruldubu söylediğinizi uygulayabilirseniz polemik kalmaz...lastwisher adlı üyeden alıntı: mesajı görüntüle
butona basıldığında uid isteyen bir vatandaşa oturupta şu kodda aynı gelme olasılığı budur bu koddda aynı gelme olsalığı budur. eğer olasılığı sıfra indirmek isterseniz sql kontrolüne gidin diye ders mi verelim. veyahut oturup buttonu js ini hazır edip hazır haldemi verelim.
$key = strtoupper(md5(microtime().rand(0,99999))); bunu alır
$key = strtoupper(md5(microtime().rand(0,9999999999999999 ))); yaparsın olasılık artar. hem saniyenin onbinde bir bir zamanda kaç kişi butona basacakki aynı id gelsin. uzaya mekik mi yollayacak arkadaş? zaten büyük bir proje yapacak deneyimi yok belliki. o zaman ona kod değil mantık öğretmek gerek. ve yukarıda gördüğüm kadarıyla (kodları sizin gibi incelemedim. zaten incelemek konu sahibine düşer zannımca) herkes bir şeyler yazmış. doğru veya yanlış. Şimdi siz belkide birilerini incittiniz. kimse burada yardım isteklerine cevap verip para almıyor. birde sizin gibiler tarafından aşağılanarak ne diye birilerine yardım etsinki? ne diye sizin gibi yaptığı işten soğutanların meydanında at koştursun ki?
mesaja başlayışınızı görünce sizi php nin tanrısı zannettim biraz. biraz indirin üstadım biraz indirin o burnunuzu.Alıntı - 24-10-2013, 22:05:22ben tam olarak anlamadım ... yani kod unique string üretmiyormu?lastwisher adlı üyeden alıntı: mesajı görüntüle
function uniqerand($len = 7) { $word = array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9')); shuffle($word); return substr(implode($word), 0, $len); } $i = 0; while($i < 20){ echo $i.' - ABC'.uniqerand().'<br /> '; $i++; }while döngüsü içinde denemede çıkan sonuç,
0 - ABCXhNQ0lu 1 - ABC0RSqdaL 2 - ABCkWfFTYI 3 - ABCMzDeoV5 4 - ABCAm0fiG6 5 - ABCi3oQJWE 6 - ABCNVt0CnT 7 - ABCilT8ar9 8 - ABCdY2FQys 9 - ABC0zBkFhD 10 - ABCyhoW4dw 11 - ABCymxMSHp 12 - ABCPbOL2sf 13 - ABCL4AVM6B 14 - ABCPcJ8v0s 15 - ABCmRJjEOZ 16 - ABCY6FRGhC 17 - ABCd0t8FRz 18 - ABCjCN7VAb 19 - ABCmA987Do
siz bu çıktının tahmin edilecenimi söylüyorsunuz? - 24-10-2013, 22:27:07@madly0011 Üstadım, dediğim gibi yürür gider bu konuşma.Ortaya bişey koymuyorsunuz, koyan insanlara çemkiriyorsunuz. Burnumla ilgili yorumunuzu, bilginizle örterseniz rahatsız edici olmaz.
Yanlış anlaşılma olmuş, çıktığının tahmin edileceğini değil "unique" olmasının tahmin edildiğini(öngörüldüğünü) yazdım.betabil adlı üyeden alıntı: mesajı görüntüle
Çok daha basit bi örnek vereyim 1 ila 10 arasında random bir sayı alıp bunu eşsiz kabul etmeniz ile 1-1000000 arasındaki bir sayıyı rasgele alıp eşsiz kabul etmeniz arasındaki tek fark olasılıktır. Tekrar eden bir sabitle üretilen hiçbir algoritma eşsiz sonuç üretmez.
Yani sizin orada kullandığınız suffle ın üretebileceği bir kombinasyon sınırı vardır mesela a-z 26 karakter 26!(faktoriyel)x27!x26x... diye gider ( detalı bilgi http://www.matematiktutkusu.com/tags...+form%FClleri/ )
yani belirli bir olasılıkda tekrar etme şansı vardır. (çoook küçük bir olasılık)
Benim bahsettğim sonuç çok uç noktalar, fakat şunu unutmamak lazım mesela "milyonda bir ihtimal" dediğiniz ihtimal günümüzde çok kolay tekrar edebilir bir ihtimal, benim it danışmanlığı yaptığım bir firma var, her yıl 10-12 milyar satır veri arşivliyor, şimdi milyonda bir hata yapan bir sistem binlerce hata yapar bu ölçeklerde.
Bunlar basit kullanımlarda sorun çıkartmasada, uzun vadeli kullanımlarda sorun çıkartabiliyor.Ve bu micro ölçekli bir bugı milyonlarca satır kod arasından ayıklamak ölüm.
PS : Umarım yanlış anlatmadım kendimi, yaptığınız yanlış demek istemedim,%100 doğru değil demek istedim.
Saygılar tekrardan. - 24-10-2013, 22:51:22@lastwisher verdiğiniz bilgiler asıl sorunun mantığını aşıyor ...
soru;
A-B, a-b, 0-9 = 62 karakter, kod başlangıcındaki ABC silinirse 7 karakter,Quismo adlı üyeden alıntı: mesajı görüntüle
bu kombinasyonla hesaplanırsa,

491796152 de 1 ihtimal ... 7 karakterli bir string için gayet makul olasılık, kafa karışıklığı gereksiz - 25-10-2013, 00:37:17Bende de şöyle bir şey var ;
function generateHash($length) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; return substr(str_shuffle($chars),0,$length); }yada
function generateRandomString($length = 10) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, strlen($characters) - 1)]; } return $randomString; }Arkadaşlar iyi diyorsunuz hoş diyorsunuz da bunu tam uniq yapmak için ne yapmak gerek. Mesela ben her session için bir token üretiyorum, ama ürettiğim tokenların bir şekilde aynı olma olasılığı var elbette, nasıl çözeceğiz bu sorunu ? time() ile o anki değeri alsak microsaniye ile bu random değeri birleştirsek bir çözüm olur mu ? Aynı microsaniye içersinde aynı kodun üretilme olasığını hesaba katmaz isek tabi öyle bir şey olacaksa da olsun.


matematik dehaları konuya lütfen