2011-02-25 19 views
5

Bir diziden benzersiz bir dizeye ihtiyacım var, böylece bu dizinin girişlerini ölçmeden değiştiğini anlayabiliyorum. Dizideki değişikliklere bakmak için kod eklemek yerine bir değeri hesaplamak için hesaplama açısından verimli olup olmadığını araştırmaya çalışıyorum. Dizinin kendisi çeşitli değerlere sahip olabilir ve gelecekteki prova için diziye yeni değerlerin eklenip eklenmediğini denemek ve ölçmek istemiyorum, sadece dizinin kendisi için değişecek bir dizi veya karma oluşturmak istiyorum. değişir. Örneğin bu şekildeBir php dizisinden benzersiz bir dize nasıl oluşturulur

: Ben tuşlarının sırası bu o zaman için kullanabileceğiniz benzersiz bir dize doğurabileceğini değişmemiştir onaylamak için eklenen bir ksort ile belki md5(http_build_query($a)) kullanmak idiyse

$a = Array(
'var1' => 1, 
'var2' => 2, 
'var3' => 3, 
); 

dizinin değişip değişmediğini değerlendirmek için uygulamanın başka bir çalışmasına karşı karşılaştırın.

Buna alternatif, muhtemelen daha hızlı veya daha şık çözümler arıyorum.

+0

'array_diff()'? – drudge

+0

Dizisel düzeninin değişip değişmediğini kontrol etmek için array_diff'in uğraşacağını düşünmüyorum. Diziyi json_encode edebilir ve bunun bir özetini alabilirsin. Json_encode ve http_build_query'nin performansını kontrol etmek isteyebilir. – Endophage

+0

çoğaltılmış ...... – dynamic

cevap

2

Tüm fikirler için teşekkürler çocuklar.

Sunucumun yüklü olmadığı bir sha-256 dışında hepsini denedim.

İşte sonuçlarına: operation 1000 kez çalıştırıp sonucu ortalama oluyor

Average (http_build_query): 1.3954045954045E-5 
Average (diff): 0.00011533766233766 
Average (serialize): 1.7588411588412E-5 
Average (md5): 1.6036963036966E-5 
Average (implode-haval160,4): 1.5349650349649E-5 

. Birkaç kez yeniledikten sonra, http_build_query'nin en hızlı olduğunu söyleyebilirim. Birisi, bu yöntemi kullanmanın herhangi bir tuzağını düşünebilirse, bir sonraki sorum olacak mı?

Teşekkür

İşte benim kod

:

class a { 

    static $input; 

    function test() { 
     $start = null; 
     $s = $e = $d = $g = $h = $i = $k = array(); 
     self::$input = array(); 

     for ($x = 0; $x <= 30; $x++) { 
      self::$input['variable_' . $x] = rand(); 
     } 

     for ($x = 0; $x <= 1000; $x++) { 
      $start = microtime(); 

      $c = http_build_query(self::$input); 
      ($c == $c); 

      $s[] = microtime() - $start; 
     } 

     for ($x = 0; $x <= 1000; $x++) { 
      $start = microtime(); 

      $c = md5(http_build_query(self::$input)); 
      ($c == $c); 

      $e[] = microtime() - $start; 
     } 

     for ($x = 0; $x <= 1000; $x++) { 
      $start = microtime(); 

      $c = array_diff(self::$input, self::$input); 

      $d[] = microtime() - $start; 
     } 
     for ($x = 0; $x <= 1000; $x++) { 
      $start = microtime(); 

      $c = serialize(self::$input); 
      ($c == $c); 

      $g[] = microtime() - $start; 
     } 

     for ($x = 0; $x <= 1000; $x++) { 
      $start = microtime(); 

      $c = hash("haval160,4", implode(',',self::$input)); 
      ($c == $c); 

      $h[] = microtime() - $start; 
     } 
     echo "<pre>"; 

//print_r($s); 
     echo "Average (http_build_query): " . array_sum($s)/count($s) . "<br>"; 
     echo "Average (diff): " . array_sum($d)/count($d) . "<br>"; 
     echo "Average (serialize): " . array_sum($g)/count($g) . "<br>"; 
     echo "Average (md5): " . array_sum($e)/count($e). "<br>"; 
     echo "Average (implode-haval160,4): " . array_sum($h)/count($h); 
    } 

} 

a::test(); 
+0

kahrolası 'array_diff (self :: $ input, self :: $ input); – delphist

+0

pratik kullanımda iyi, bu uygulama için, çoğu zaman bir maç olacak bu yüzden zaman saymak istediğime karar verdim Bir eşleşmeyi tanımlamak yerine bir eşleşmeyi tanımlamak gerekir. Haklıysam, eşleşmeyen bir eşleşmenin tanımlanması daha az zaman alır çünkü her anahtarı yinelemek ve kontrol etmek zorundadır. Sadece bir fark bulup bulmadığını kontrol etmeyi bırakacaktı, ki bu, o mantık tarafından gidip umarım ki aynı değişkenler ile kıyaslayarak daha muhafazakâr olmak demektir. – Jason

1

Her zamanda

$str = implode(",", $a); 
$check = hash("sha-256", $str); 

Teorik olarak, bu dizi boyutu, veri veya sipariş değişiklikleri algılamalıdır yapabilirdi.

Elbette dilediğin herşeyi kullanabilirsin. Bunun için md5(serialize($array)) kullanıyorum.

+0

Aslında, delphist muhtemelen doğrudur, dizinin boyutunu bilmiyorsanız, serialize() muhtemelen daha iyi çalışır. – shmeeps

7

Daha iyi, çünkü çok boyutlu diziler için çalışıyor.

2

PHP, bir array_diff() işlevine sahiptir, sizin için herhangi bir kullanım olup olmadığını bilmiyorum.

Aksi taktirde, sonuç olarak, dizinin her bir değerinin üzerinde yinelenerek ve bunları artımlı karma içine ekleyerek php: http://www.php.net/manual/en/function.hash-init.php tarafından sunulan artımlı karma olasılığını kullanabilirsiniz.

İlgili konular