Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么';确定数据是否已更改的最佳方法是什么?_Php_String_Md5_Checksum - Fatal编程技术网

Php 什么';确定数据是否已更改的最佳方法是什么?

Php 什么';确定数据是否已更改的最佳方法是什么?,php,string,md5,checksum,Php,String,Md5,Checksum,如果我有一个动态生成的CSS文件,我应该使用哪个函数为整个文件内容生成一个简短的标识字符串 md5还是crc32?其他?对您的问题的简短回答是:md5应该足够了 较长的答案是: 取决于。。。我们在谈论多少文件。md5生成的唯一哈希的理论最大值为2^64,但您必须考虑生日问题。 但是,对于数百万个文件哈希,哈希冲突的几率增加了1/2^64(2-128) 如果你处理的文件数量很大,我会选择一种更安全的hasing算法。我认为使用sha1是有道理的。特别是考虑到在现代计算机上增加的开销/成本可以忽略不

如果我有一个动态生成的CSS文件,我应该使用哪个函数为整个文件内容生成一个简短的标识字符串


md5还是crc32?其他?

对您的问题的简短回答是:md5应该足够了

较长的答案是:

取决于。。。我们在谈论多少文件。md5生成的唯一哈希的理论最大值为2^64,但您必须考虑生日问题。
但是,对于数百万个文件哈希,哈希冲突的几率增加了1/2^64(2-128)

如果你处理的文件数量很大,我会选择一种更安全的hasing算法。我认为使用sha1是有道理的。特别是考虑到在现代计算机上增加的开销/成本可以忽略不计。
如果我们谈论的是十几个文件,那么md5就足够了。不过,使用sha1并不愚蠢。这是一个相当快、相当可靠的散列。虽然从理论上讲,碰撞不再被认为是安全的,但在野外还没有观察到碰撞 支持这一点,说:

Marc Stevens 2011年的一次攻击可以产生261个操作复杂度的哈希冲突。目前还没有实际的碰撞发生

无论哪种方式,261都应该足够了

哦,如果你想知道:这里有解释吗

应用于您的用例
由于您正在对文件进行哈希处理,因此使用类似的php函数看起来确实很诱人。但是,可能是因为md5被证明是不安全的,PHP附带了函数。
使用
crc32
一开始似乎是一个有效的选项,因为它是为了生成哈希来检查文件完整性而开发的。但它确实很老了,而且因为散列本身只有32位,所以冲突的风险比使用md5或sha1时更大

比较:

|-------+-------+-------+--------+
| Comp. | CRC32 |  MD5  |  SHA1  |
+-------+-------+-------+--------+
| Bits  |  32   |  128  |  160   |
+-------+-------+-------+--------+
| c.rest|  2^16 |  2^18 |  2^61  | (sha1 in theory)
+-------+-------+-------+--------+
| crypt |  No   |  No   |  No    |
+-------+-------+-------+--------+
| cost  |   1   |   2   |  3.1   | (crc32 used as base)
+-------+-------+-------+--------+
 * c.rest: collision resistance
 * crypt: Cryptographically secure
成本价值注释:
我运行了一些PHP脚本,比较了计算哈希所需的时间。对大约15个字符长的随机字符串进行一百万次散列只需0.25微秒。md5哈希值的计算只需半秒钟(结果范围为0.43到0.56,收敛于0.55)。sha1哈希在0.78微秒内生成(结果范围为0.76到0.8001)。所用时间是指生成所有1000000个哈希所用的时间

更多:

CRC32碰撞公式

下面是一个随机字符串生成器,允许您测试“常见”哈希冲突的程度:

<?php
class RSGen
{
    private $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    private $max = 61;
    private $hashed = array();

    public function randomUniqueString($len = 15)
    {
        $str = '';
        for ($i=0;$i<$len;++$i)
        {
            $str .= substr($this->pool, mt_rand(0, $this->max),1);
        }
        $hash = crc32($str);
        if (isset($this->hashed[$hash]))
        {
            for ($i=0,$j=count($this->hashed[$hash]);$i<$j;++$i)
            {
                if ($this->hashed[$hash][$i] === $str)
                {
                    return $this->randomUniqueString($len);
                }
            }
            echo 'Collision: ', $hash, PHP_EOL, $str, PHP_EOL, implode(', ', $this->hashed[$hash]), PHP_EOL;
            return false;
        }
        else
            $this->hashed[$hash] = array();
        $this->hashed[$hash][] = $str;
        return $str;
    }
}
$gen = new RSGen();
for($i=0;$i<1000000;++$i)
{
    $str = $gen->randomUniqueString();
    if ($str === false)
    {
        echo PHP_EOL,'Collision after ', $i, ' tries', PHP_EOL;
        break;
    }
}
与sha1相同:

:%s/crc32/sha1/g

md5很好,我不知道标题问题though@Max如果文件(数据)的内容已更改,则校验和将更改。谢谢,我想我将使用md5()来确定文件修改时间:)@Alex:修改时间不是确定文件上次修改时间的最可靠方法,不过:将时间设置为“现在”,在不更改文件内容的情况下:
触摸某些文件
。还不错,但我可以很好地更改文件,然后将修改时间设置为其以前的值,似乎保持文件不变:
vim someFile
[edit&save]
touch-t 2014010100000.00 someFile
->文件最后一次更改似乎是在2014年1月1日午夜。将数字替换为我编辑文件之前的时间,您的代码不会发现差异
:%s/crc32/sha1/g