PHP gerçekten eşsiz bir sipariş kimliği oluşturuluyor?

4 Cevap php

http://phpgoogle.blogspot.com/2007/08/four-ways-to-generate-unique-id-by-php.html: Ben bu kullanarak düşünüyor yaşıyorum

Benim fikrim, 2 ile 3 arasında bir karışımı kullanmaktır. Ama benim soru şansını küçük olmasına rağmen ben sadece 5 karakterli olması sonucu substrine eğer, aynı sipariş # ile iki emir oluşturulabilir ki hala bir şans var, yani Uzun? Ne 3 hakkında? 2? 1? Durum 1 eğer Şüphesiz, kimliği aynı olacağını bir 1 / (26 + 10) şansı var mı?

4 Cevap

Kullanıcıların doğrulanmış ve bir kullanıcı kimliği var varsayarsak:

$unique_id = time() . mt_rand() . $userid;

Aynı kullanıcı istekleri bu sayfayı aynı saniyede bir ikinci kez ise, yine muhtemelen bununla yaşayabilirim benim makine getirileri 2147483647 hangi., mt_getrandmax() içinde 1 bir şans olacak?

Kullanıcıların kimlik doğrulaması değilseniz eğer isterseniz, bunun yerine kendi IP adresi bir karma kullanabilirsiniz.

Neden benzersiz bir kimlik gerekir?

Eğer DB benzersiz bir kimlik oluşturmak istiyorsanız, o zaman otomatik artış kullanarak, DB bırakın.

Neyse, bir Microtime'da kombinasyonu () ve rand () kullanabilirsiniz. Sen oldukça benzersiz olacak.

Edit, relative to OP's comment :

Bir "her zaman benzersiz" eğer olamaz. Yoksa nasıl bulursanız, bir Turing ödülü kazanacak.

Hatta daha iyi matematiksel metodlardan "evet ama bir kez 15645736536475 zamanlarda, ben vidalı alırsınız" bir tat bırakır.

Tek yolu, yeni bir kimlik ihtiyacı her şey artırmak olduğunu, sayaç sahip olmaktır. İşte DBs yapmak nasıl. Neden yerleştirmeden önce kimliği gerekiyor?

Eğer rastgele bir dize dayanarak eğer o zaman evet, iki kimlikleri aynı olacağını teorik olarak mümkündür. Uzun bir rasgele dize kabul olması için bu ihtimal pek olası yapmak için, kullanılan yüzden. Olasılıkları hesaplanabilir: Örneğin bir kimlik (en yakın ikinci için) şimdiki zaman oluşan ve rastgele 5-karakter alfanümerik dize, ve 3 kimlikleri aynı saniyede üretilen varsayarak ise, o zaman iki ihtimal ( veya daha fazla) aynı ediliyor: 1 - (! ^ 5 38 / (38 ^ 5-3) / 38 ^ 5 ^ 3) = 3.79e-8. Çoğu insan bu tür oranlar size bağlı sayfa yerine 10 karakter göstermektedir neden olan, pratik uygulamalar için yeterli not düşük olduğunu kabul ediyorum.

Eğer bir oturum kimliği, kullanıcı adı, vb varsa, o zaman konularda yardımcı olmak, sipariş kimliği bu kullanabilirsiniz.

PHP'nin uniqid 's manpage alınan:

$better_token = md5(uniqid(mt_rand(), true));

o (2 ^ 128 jeton sayısını azaltır) md5-bölümünü terk etmek daha iyi olabilir ama

Lütfen bir veritabanı kullanılıyorsa, o zaman evet, sizin DBMS id yılların nesil halledeyim gerekir