如何在PHP中组合哈希

时间:2017-03-29 04:14:34

标签: php hash hashcode

我想问一下如何在PHP中组合哈希码?

例如,我在这里有一些校验和(只是样本校验和):

checksum1:b62e146dbc34b6f7dd0d7b1dc4e6c93ebc2a0016793e3af701fe4f3eab3299d1
checksum2:dsfhsdf8s6f87e4r34ijtr5i34u5934534534ij5340598348534095834095j34
checksum3:4324298sdfhsdhfsdhf387455hsdfhsdf9358903485jsdfjsdjfsiuf03458345

如果我将这些文件的样本校验和分成3个部分,我必须合并前2个校验和,然后合并最后的校验和。

编辑:组合意味着如果我合并2个校验和,它将生成新的校验和。

我想通过代码实现这里所说的内容:

  

合并前两个哈希并获取结果的二进制哈希值。

     

$ cat hash1 hash2> hash12

     

$ openssl dgst -sha256 -binary hash12> hash12hash

这是在命令行界面中。二进制结果后来转换为十六进制。 PHP怎么可能?

5 个答案:

答案 0 :(得分:1)

你可以使用。运算符组合

        $checksum1='b62e146dbc34b6f7dd0d7b1dc4e6c93ebc2a0016793e3af701fe4f3eab3299d1';
        $checksum2='dsfhsdf8s6f87e4r34ijtr5i34u5934534534ij5340598348534095834095j34';
        $checksum3='4324298sdfhsdhfsdhf387455hsdfhsdf9358903485jsdfjsdjfsiuf03458345';

echo $checksum1.$checksum2.$checksum3;

答案 1 :(得分:1)

您可以使用hash()函数,例如,如下面的无体for循环:

$checksums = [ 
    'b62e146dbc34b6f7dd0d7b1dc4e6c93ebc2a0016793e3af701fe4f3eab3299d1',
    'dsfhsdf8s6f87e4r34ijtr5i34u5934534534ij5340598348534095834095j34',
    '4324298sdfhsdhfsdhf387455hsdfhsdf9358903485jsdfjsdjfsiuf03458345'
];


for ($i = 1, $hash = $checksums[0];
     $i < sizeof($checksums);
     $i++, $hash = hash('sha256', $hash.$checksums[$i]));

echo $hash;

这会将哈希值计算为hash(hash(checksum1 + checksum2) + checksum3)

在您的问题中,您使用-binary标志和openssl dgst命令。你可以在PHP中通过传递true值作为调用PHP hash()函数的第三个参数来做同样的事情,但如果你开始组合,我真的不知道这有多大意义两个以上的哈希。

<强>更新

在评论中,明确指出实际目标是计算用于AWS的树形哈希。最简单的方法是使用AWS SDK for PHP中的TreeHash类。

答案 2 :(得分:1)

我已经找到了问题的答案。我在AWS开发工具包中使用了Tree hash类,并使用save_word2vec_format()函数添加了校验和,并传递了每个分割文件的校验和,以便使2个校验和匹配。 谢谢你的想法。

答案 3 :(得分:0)

我会内爆然后爆炸它。它非常适合在文件等中存储哈希值:

<?php

$checkSums = Array(
    "b62e146dbc34b6f7dd0d7b1dc4e6c93ebc2a0016793e3af701fe4f3eab3299d1",
    "dsfhsdf8s6f87e4r34ijtr5i34u5934534534ij5340598348534095834095j34",
    "4324298sdfhsdhfsdhf387455hsdfhsdf9358903485jsdfjsdjfsiuf03458345"
);
//simply combine via $checksum1 . '|' . $checksum2 . '|' . $checksum3, and then explode it the way listed bellow

$combined = implode('|', $checkSums);

$notCombined = explode('|', $combined);

?>

答案 4 :(得分:0)

只需使用opensslsystem()

调用exec()即可
<?php
$checksum = system( "openssl dgst -sha256 -binary hash12" );
?>