CRC64文件校验和PHP实现

5
我可以使用PHP获取文件的CRC64校验和。
使用以下代码:
file_put_contents('example.txt', 'just an example');

echo hash_file('crc32', 'example.txt');

我得到了CRC32校验和"c8c429fe";
但我需要使用CRC64算法来获取校验和(参见下图): enter image description here 我从这里获取了相关信息:http://en.wikipedia.org/wiki/Cyclic_redundancy_check 请问如何在PHP中实现这个哈希算法?

3
请查看 http://php.net/crc32 的评论。 - deceze
1
这个答案提供了Morfi的解决方案。然而,您没有将其标记为解决方案。 - Hakuno
3个回答

7

在php 64位上实现crc64()

https://www.php.net/manual/en/function.crc32.php#111699

<?php

/**
* @return array
*/
function crc64Table()
{
    $crc64tab = [];

    // ECMA polynomial
    $poly64rev = (0xC96C5795 << 32) | 0xD7870F42;

    // ISO polynomial
    // $poly64rev = (0xD8 << 56);

    for ($i = 0; $i < 256; $i++)
    {
        for ($part = $i, $bit = 0; $bit < 8; $bit++) {
            if ($part & 1) {
                $part = (($part >> 1) & ~(0x8 << 60)) ^ $poly64rev;
            } else {
                $part = ($part >> 1) & ~(0x8 << 60);
            }
        }

       $crc64tab[$i] = $part;
    }

    return $crc64tab;
}

/**
* @param string $string
* @param string $format
* @return mixed
*
* Formats:
*  crc64('php'); // afe4e823e7cef190
*  crc64('php', '0x%x'); // 0xafe4e823e7cef190
*  crc64('php', '0x%X'); // 0xAFE4E823E7CEF190
*  crc64('php', '%d'); // -5772233581471534704 signed int
*  crc64('php', '%u'); // 12674510492238016912 unsigned int
*/
function crc64($string, $format = '%x')
{
    static $crc64tab;

    if ($crc64tab === null) {
        $crc64tab = crc64Table();
    }

    $crc = 0;

    for ($i = 0; $i < strlen($string); $i++) {
        $crc = $crc64tab[($crc ^ ord($string[$i])) & 0xff] ^ (($crc >> 8) & ~(0xff << 56));
    }

    return sprintf($format, $crc);
}

1
还可以在GitHub上查看:https://gist.github.com/hightemp/4da5ac39b8d57fcd7e7988b90a48017d - Russell G
你应该在这个实现中添加一些证明。 - JSON

0

由于 PHP 的 int 内部定义为带符号的长整型(signed long),因此不能在 PHP 中实现真正的 crc64,意味着它只能处理 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之间的值,而 crc64 返回的是无符号长整型。这里的答案有些误导性,因为这个原因。请参见 @deceze 在评论中提供的 http://php.net/crc32,但要理解在 64 位 PHP 构建上使用 crc64 会像 32 位 PHP 构建上使用 crc32 一样存在这个问题。

因此,在算法的第一部分(x64)中,PHP 会发生溢出,可能会在本来不应该溢出的情况下设置其余部分也会溢出,例如 x4


0

hash_file只是一个包装器,它将file_get_contents($file)的结果传递给一个包装器,因此您可以使用任何函数而不是'crc32'。

你必须使用crc64吗?如果你只想要散列文件,你可以使用md5和sha,它们可以像这样轻松地使用。

$hash = hash_file("sha1", $file);

否则,您可以自己编写crc64实现。
function crc64($string){
    // your code here
}

$hash = hash_file("crc64", $file);

谢谢你,@nyson!是的,我必须使用CRC64算法,但我找不到PHP中的任何实现。 - artask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接