Gerçekten eşsiz bir rasgele sayı php üretmek?

7 Cevap php

Ben kullanıcı tarafından yükleme görüntüleri büyük sayıda ev sahipliği için yukarı php komut dosyası oluşturmak gelmiş değilim, gelecekte hiçbir dosya çatışma olacağını, böylece görüntü dosya için rasgele sayılar oluşturmak için en iyi yolu nedir? Bu Imageshack gibi ol. Teşekkürler.

7 Cevap

(Bir veritabanı tablo veya bir dosyada) Oluşturduğunuz tüm önceki numaralarının kalıcı bir listesini tutun ve yeni oluşturulan sayı listesinde olanlar arasında olmadığını kontrol edin. Bu pahalı olması bulursanız, çarpışma çok düşük bir olasılık garanti bit yeterli sayıda rasgele sayı üretmek.

Ayrıca, sadece birden çok kullanıcı aynı anda dosya upload eğer çarpışmalar alamadım emin olmak için, şimdiki zaman ve bir random_part dayalı bir timestamp_part bir birleştirme gibi, bu numaraları verilmesi aşamalı bir yaklaşım kullanabilirsiniz.

En kolay yolu, her dosya için yeni bir GUID olacaktır.

http://www.php.net/manual/en/function.uniqid.php#65879

İşte senin çözümünü uygulamaya nasıl

Bu örnek i istediğinizi varsayar

  • Benzersiz ve rastgele 50 sayı içeren bir listesini almak ve
  • 0-1000 numara tayfından gelmesi # Bu liste

Kod:

 //developed by www.fatphuc.com

 $array = array(); //define the array

 //set random # range
 $minNum = 0;
 $maxNum = 1000;

// i just created this function, since we’ll be generating
// # in various sections, and i just want to make sure that
// if we need to change how we generate random #, we don’t 
// have to make multiple changes to the codes everywhere. 
// (basically, to prevent mistakes)

function GenerateRandomNumber($minNum, $maxNum){
   return round(rand($minNum, $maxNum));
}

//generate 49 more random #s to give a total of 50 random #s
for($i = 1; $i <= 49; $i++){
    $num1 = GenerateRandomNumber($minNum, $maxNum);   
        while(in_array($num1, $array)){
            $num1 = GenerateRandomNumber($minNum, $maxNum);
        }   
    $array[$i] = $num1;
}

asort($array); //just want to sort the array

//this simply prints the list of #s in list style
echo '<ol>';
foreach ($array as $var){
    echo '<li>';
    echo $var;
    echo '</li>';
}
echo '</ol>';

Yukarıda önerilen olarak () microtime kullanın ve daha sonra kesin çağdaş yüklenenler (nadir) durumda çarpışmaları önlemek için orijinal dosya bir karma ekleme olabilir.

Bakılmaksızın rasgele sayı üreteci ne kadar iyi - rastgele değerler benzersiz olacağını sizin önermesiyle birçok kusurları vardır. Ayrıca, rasgele sayı üreteci daha iyi, o kadar uzun sonuçlarını hesaplamak için alır.

Yinelenen gönderimler tespit added parası olsun bu şekilde - bu veri dosyası bir karma kullanmak daha iyi olmaz.

Çiftleri tespit known olmayan bir konu olacaksa, o zaman ben yine de bu yaklaşımı tavsiye ama tespit çarpışmalar dayalı çıktı değiştirmek (ama Lo'oris tarafından önerilen çok daha ucuz bir hesaplama yöntemi kullanılarak) ediyorum örneğin

 $candidate_name=generate_hash_of_file($input_file);
 $offset=0;
 while ((file_exists($candidate_name . strrev($offset) && ($offset<50)) {
    $offset++;
 }
 if ($offset<50) {
    rename($input_file, $candidate_name . strrev($offset));
 } else {
    print "Congratulations - you've got the biggest storage network in the world by far!";
 }

Bu size bir SHA1 hash kullanarak yaklaşık 2 * 25 ^ 63 dosyaları saklamak için kapasitesini verecek.

Karma oluşturmak için nasıl gibi, PHP içine tüm dosya okuma (bunu karma tek bir dizeye hepsini okumaya çalışın özellikle) yavaş olabilir. Çoğu Linux / Posix'e / Unix sistemleri çok verimli bir akışından bir karma oluşturacak 'md5sum' gibi araçlar ile birlikte gelir.

C.

Belki bir zaman damgası dayalı bir şey kullanma. Ayrıntılar için microtime fonksiyonuna bakın. Alternatif uniqid şimdiki zamana dayalı benzersiz bir kimlik oluşturmak için.

Benim çözüm genellikle görüntü içeriğinin bir karma (MD5/SHA1 / ...) 'dir. Bu kişi iki kez aynı görüntüyü karşıya eğer hala sadece (tek bir kullanıcı siler ve başka bir kullanıcı varsa resim silinir olmadığından emin olmak gerekir ofc biraz boşluk tasarrufu, sabit diskte bir görüntü olması avantajına sahiptir Kullanılan aynı görüntü).