2011-02-25 15 views
5

Necesito una cadena única de una matriz para poder saber cuándo cambia sin medir las entradas de esa matriz. Estoy tratando de determinar si es computacionalmente eficiente calcular un valor en lugar de agregar código para detectar cambios en la matriz. La matriz en sí puede tener una variedad de valores y para pruebas futuras no quiero probar y medir si se han agregado nuevos valores a la matriz, prefiero simplemente crear una cadena o hash que cambie si la matriz misma cambios.Cómo producir una cadena única de una matriz php

Así, por ejemplo:

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

Si tuviera que utilizar md5(http_build_query($a)) tal vez con una ksort añadido para confirmar que el orden de las teclas no han cambiado esto podría entonces producir una cadena única que puedo usar para compare con otra ejecución de la aplicación para evaluar si la matriz ha cambiado.

Estoy buscando soluciones alternativas, posiblemente más rápidas o más elegantes para esto.

+0

'array_diff()'? – drudge

+0

No creo que array_diff se ocupe de verificar si el orden de las claves ha cambiado. Podrías json_encode the array y tomar un hash de eso. Puede que desee comprobar el rendimiento de json_encode y http_build_query. – Endophage

+0

duplicado ...... – dynamic

Respuesta

2

Gracias por todas las ideas chicos.

He intentado todos ellos excepto un sha-256 que mi servidor no tiene instalado.

He aquí los resultados:

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 

que se está ejecutando la operación 1000 veces y promediando el resultado. Después de refrescar un par de veces, pude decir que http_build_query fue el más rápido. Supongo que mi próxima pregunta sería si alguien puede pensar en algún inconveniente de usar este método.

Gracias

Aquí está mi código:

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

condenar su genio 'array_diff (self :: $ de entrada, self :: $ entrada);' – delphist

+0

bien en el uso práctico, para esta aplicación, la mayor parte del tiempo que va a ser un partido así que decidió que quería contar el tiempo se necesita identificar una coincidencia en lugar de identificar una falta de coincidencia. Si estoy en lo correcto, tomaría menos tiempo identificar una no coincidencia porque tiene que repetir y verificar cada tecla. Solo dejaría de comprobar si encontraba una diferencia, lo que no es así, por lo que seguir esa lógica con suerte significa que estoy siendo más conservador al comparar con las mismas variables exactas – Jason

1

siempre se puede simplemente hacer

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

En teoría, esto debería detectar cambios en el tamaño de la matriz, datos, o el pedido.

Por supuesto, puede usar cualquier hash que desee.

+0

En realidad, delphist es probablemente correcto, serialize() probablemente funcionaría mejor si no conociera la dimensión de la matriz. – shmeeps

7

Im use md5(serialize($array)) para esto. Es mejor, porque funciona para arreglos multidimensionales.

Cuestiones relacionadas