多值的哈希方法?

时间:2011-03-11 18:00:32

标签: php sorting hash

偶尔,我发现我需要对一些对象进行排序,并按多个值对它们进行分组。我通常通过将值连接在一起来实现这一点,中间使用下划线或其他描述符,然后将其用作数组索引。

// group all objects with a common parent_id, date, and type
foreach ($objects as $obj) {
    $hash = $obj->parent_id . '_' . $obj->date  . '_' . $obj->type;
    $sorted_objects[$hash][] = $obj;
}

...麻烦!除了滥用PHP的松散输入和字符串连接之外,还有一种更好的方法。有没有办法对多个值执行哈希?看来我应该能够做这样的事情:

$hash = sha1_multiple($obj->parent-id, $obj->date, $obj->type);

我已经使用过最好的方法,还是有更好的方法?

3 个答案:

答案 0 :(得分:5)

使用PHP的序列化使它更整洁,但效率更低:

function sha1_multiple() {
    $args = func_get_args();
    return sha1(serialize($args));
}

答案 1 :(得分:3)

由于散列键是字符串,你可能已经通过字符串连接的散列实现了最佳方式 - 这就是我在过去需要时执行类似功能的方式。

答案 2 :(得分:0)

  

在concat-then-hash中,“ Jim”和“ Fisher”的哈希是“ JimFisher”的哈希。反转输入会生成哈希字符串“ FisherJim”,这是一个不同的字符串,因此,通过重新排序输入,它不会受到攻击。那么,concat-then-hash不受第二次原像攻击的影响吗?您能否找到另一个与hash2_concat_then_hash(“ Jim”,“ Fisher”)冲突的输入的示例?同样,您无需强行使用它!一个示例是hash2_concat_then_hash(“ Ji”,“ mFisher”),因为“ Ji”和“ mFisher”也连接到“ JimFisher”。

有关更多信息,请查看how-to-hash-multiple-values