如何从php数组生成唯一字符串

如何从php数组生成唯一字符串,php,arrays,hash,Php,Arrays,Hash,我需要一个数组中唯一的字符串,这样我就可以在不测量该数组的输入的情况下判断它何时更改。我正在尝试计算一个值,而不是添加代码来查找数组中的更改,这在计算上是否有效。数组本身可以有多种值,为了将来的验证,我不想尝试测量是否向数组中添加了新值,我更愿意创建一些字符串或散列,如果数组本身发生变化,这些字符串或散列将发生变化 例如: $a = Array( 'var1' => 1, 'var2' => 2, 'var3' => 3, ); 如果我要使用md5(http\u build\

我需要一个数组中唯一的字符串,这样我就可以在不测量该数组的输入的情况下判断它何时更改。我正在尝试计算一个值,而不是添加代码来查找数组中的更改,这在计算上是否有效。数组本身可以有多种值,为了将来的验证,我不想尝试测量是否向数组中添加了新值,我更愿意创建一些字符串或散列,如果数组本身发生变化,这些字符串或散列将发生变化

例如:

$a = Array(
'var1' => 1,
'var2' => 2,
'var3' => 3,
);
如果我要使用
md5(http\u build\u query($a))
来确认键的顺序没有改变,那么可能会生成一个唯一的字符串,我可以使用它与应用程序的另一次运行进行比较,以评估数组是否已经改变


我正在寻找一个替代的,可能更快或更优雅的解决方案

你可以一直这样做

$str = implode(",", $a);
$check = hash("sha-256", $str);
理论上,这应该可以检测阵列大小、数据或顺序的变化

当然,您可以使用任何您想要的哈希。

Im使用
md5(serialize($array))
。它更好,因为它适用于多维数组。

PHP有一个函数,不知道它是否对您有用


否则,您最终可以使用php提供的增量散列:通过迭代数组的每个值并将它们添加到增量散列中。

感谢所有的想法

除了我的服务器没有安装的sha-256之外,我已经尝试了所有这些

结果如下:

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
这就是运行操作1000次并平均结果。在刷新了几次之后,我可以看出http\u build\u查询是最快的。我想我的下一个问题是,是否有人能想到使用这种方法的任何陷阱

谢谢

这是我的密码:

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();
a类{
静态$输入;
功能测试(){
$start=null;
$s=$e=$d=$g=$h=$i=$k=array();
self::$input=array();

对于($x=0;$x实际上,delphist可能是正确的,serialize()如果您不知道数组的维度,可能会更好。我不认为array_diff会处理检查键顺序是否已更改的问题。您可以对数组进行json_编码并对其进行哈希运算。可能需要检查json_编码和http_build_查询的性能。该死的
数组_diff(self:$input,self:$input)
在实际使用中,对于这个应用程序,大部分时间都是匹配的,所以我决定计算识别匹配所需的时间,而不是识别不匹配的时间。如果我是正确的,识别不匹配所需的时间会更少,因为它必须迭代并检查每个键。如果找到,它只会停止检查一个不同点,它没有,所以按照这个逻辑,希望这意味着通过比较完全相同的变量,我更加保守