【问题标题】:CRC64 file checksum PHP implementationCRC64文件校验和PHP实现
【发布时间】:2012-05-02 00:00:40
【问题描述】:

我需要使用 PHP 获取文件的 CRC64 校验和。

使用此代码

file_put_contents('example.txt', 'just an example');

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

我得到 CRC32 校验和“c8c429fe”;

但我需要使用 CRC64 算法获得校验和(

)

我从这里拿的:http://en.wikipedia.org/wiki/Cyclic_redundancy_check

如何在 PHP 中实现这种散列算法?

【问题讨论】:

  • php.net/crc32查看cmets...
  • Morfi's 完成了这项工作。但是,您没有将其标记为解决方案。

标签: php checksum crc


【解决方案1】:

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 中找不到该算法的任何实现。
【解决方案2】:

在 php 64bit 上实现 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);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 2016-04-13
相关资源
最近更新 更多