缺少array_hash()函数.无法创建数组的哈希


Missing array_hash() function. Can not create a hash of an array

简介

我需要一个函数,可以接受一个数组并返回它的散列

这应该类似于spl_object_hash((,只是它返回给定数组的哈希。

到目前为止,我已经尝试过

function array_hash(array $array) {
   return spl_object_hash((object) $array); 
}

问题

1( 这个算法本身并不有效。例如,如果我通过这样的东西:

  $array = array(
     'foo' => 'bar',
     'bool' => false,
     'junk' => array(
         'junk1' => array('foo' => array('__test__'))
      )
  )

它不会将嵌套数组强制转换为对象。

2( 另一个主要问题是,spl_object_hash()在每个新的HTTP请求上为同一对象返回不同的散列。

问题

再次:我需要一个数组的持久散列。与spl_object_hash()不同,将在每个HTTP请求上持久化如何正确地执行此操作

先序列化数组怎么样?

md5(serialize($array));

Martin的上述回答很好,但我所做的是:

function array_signature($arr, $sort=true)
{
    // Sorting helps generating a similar fingerprint for similar arrays
    if($sort) {
        array_multisort($arr);
    }
    // MD5 seems to be the fastest hashing function -- we don't care about collision for this
    // JSON seems faster than serialize()
    return md5(json_encode($arr));
}

调用array_multisort()首先确保对于关联数组,返回相同的签名:

  • ['a'=>1, 'b'=>2]
  • ['b'=>2, 'a'=>1]

基准测试似乎一致认为:md5()是PHP中最快的哈希函数。它有很多潜在的安全问题,所以不应该用于哈希密码,但对于数组签名来说,这不应该是一个问题。

类似地,json_encode()是PHP中最快的编码算法(比serialize()快(