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