PHP en MD5 çok boyutlu diziye yolu?

4 Cevap php

i çok boyutlu bir dizinin bir MD5 oluşturmak için en iyi yolu (ya da herhangi bir başka karma) nedir merak ediyorum?

Ben rahatlıkla bir dizeye her değeri birleştirerek, dizinin her düzeyde üzerinden geçeceğine dair bir döngü yazmak ve sadece dize MD5 performans olabilir.

Ancak, bu en iyi hantal görünüyor ve çok boyutlu bir dizi çekmek, ve karma olacak bir korkak fonksiyon olup olmadığını ben merak ettiniz mi?

Zaman ayırdığınız için teşekkürler.

4 Cevap

(Copy-n-paste-able function at the bottom)

Önceden belirtildiği gibi, aşağıdaki çalışır.

md5(serialize($array));

Ancak, bu (ironik) json_encode gerçekleştirir noticeably daha hızlı fazlalaştı:

md5(json_encode($array));

Aslında, hız artışı (1) tek başına json_encode serialize daha hızlı yapar, ve (2) json_encode işlemek için md5 için küçük bir dize ve bu nedenle daha az üretir gibi burada iki kat fazladır.

Edit: İşte bu iddiayı destekleyecek kanıtlar:

<?php //this is the array I'm using -- it's multidimensional.
$array = unserialize('a:6:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}i:5;a:5:{i:0;a:0:{}i:1;a:4:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}i:3;a:6:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}i:5;a:5:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}}}');

//The serialize test
$b4_s = microtime(1);
for ($i=0;$i<10000;$i++) {
    $serial = md5(serialize($array));
}
echo 'serialize() w/ md5() took: '.($sTime = microtime(1)-$b4_s).' sec<br/>';

//The json test
$b4_j = microtime(1);
for ($i=0;$i<10000;$i++) {
    $serial = md5(json_encode($array));
}
echo 'json_encode() w/ md5() took: '.($jTime = microtime(1)-$b4_j).' sec<br/><br/>';
echo 'json_encode is <strong>'.( round(($sTime/$jTime)*100,1) ).'%</strong> faster with a difference of <strong>'.($sTime-$jTime).' seconds</strong>';

Json_encode sürekli üzerinde 250% (2.5x) daha hızlı (genellikle üzerinde% 300) - Bu önemsiz bir fark değildir. Burada bu canlı komut ile test sonuçlarını görebilirsiniz:

Şimdi dikkat, bir şey (1,2,3) dizi (3,2,1) gibi farklı bir MD5 üretecek dizidir. If Bu ne istediğiniz değil. Aşağıdaki kodu deneyin:

//Optionally make a copy of the array (if you want to preserve the original order)
$original = $array;

array_multisort($array);
$hash = md5(json_encode($array));

And for good measure, here's a function/method you can copy and paste (tested in 5.3.3-1ubuntu9.5):

function array_md5(Array $array) {
    //since we're inside a function (which uses a copied array, not 
    //a referenced array), you shouldn't need to copy the array
    array_multisort($array);
    return md5(json_encode($array));
}

Kenara Brock mükemmel cevap (1), herhangi bir terbiyeli kıyım kitaplığı artışlarla karma güncellemek için izin verir, böylece yerine dev bir dize oluşturmak zorunda, her dize sırayla ile güncellemek gerekir.

Bkz: hash_update

md5(serialize($array));

Çalışır, ancak karma (bu olsa önemli olmayabilir) dizisinin sırasına göre değişecektir.

Ben bu iyi bir ipucu olabileceğini düşünüyorum:

Class hasharray {

    public function array_flat($in,$keys=array(),$out=array()){
        foreach($in as $k => $v){
            $keys[] = $k; 
            if(is_array($v)){
                $out = $this->array_flat($v,$keys,$out);
            }else{
                $out[implode("/",$keys)] = $v;
            }
            array_pop($keys);
        }
        return $out;  
    }

    public function array_hash($in){
        $a = $this->array_flat($in);
        ksort($a);
        return md5(json_encode($a));
    }

}

$h = new hasharray;
echo $h->array_hash($multi_dimensional_array);