Php 多值上的哈希方法?
有时,我发现我需要对一些对象进行排序,按多个值对它们进行分组。我通常通过将这些值连接在一起来实现这一点,在它们之间加一个下划线或其他分隔符,然后将其用作数组索引Php 多值上的哈希方法?,php,sorting,hash,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;
// 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);
我已经在使用最好的方法了,还是有更好的方法?使用PHP的序列化使它更整洁,但效率更低:
function sha1_multiple() {
$args = func_get_args();
return sha1(serialize($args));
}
因为散列键是字符串,所以您可能已经在用最好的方式,通过字符串串联的散列来实现它了——这就是我过去在需要时执行类似函数的方式 在concat-then散列中,“Jim”和“Fisher”的散列是“JimFisher”的散列。反转输入会产生“FisherJim”的散列,这是一个不同的字符串,因此它不容易受到通过重新排序输入的攻击。concat-then-hash是否能够抵御第二次预映像攻击?你能找到另一个输入与hash2\u concat\u然后\u hash(“Jim”,“Fisher”)冲突的例子吗?再说一次,你不需要强迫它!一个例子是hash2_concat_then_hash(“Ji”,“mFisher”),因为“Ji”和“mFisher”也连接到“JimFisher”
有关更多信息,请查看它没有比简单的字符串连接快多少,即使不需要SHA1步骤,除非您需要所有键都具有相同的字符串长度。