gpt4 book ai didi

java - 同步文件

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:49 25 4
gpt4 key购买 nike

我有一个项目,其中一个文件必须跨计算机同步。

我的问题是我的程序给出了一个错误,它用完了 30 秒的执行时间。

现在,我已经为此用 php 编写了一个程序;它所做的是将旧文件分成 block ,并对每个 block 进行 md5 哈希并进行比较它通过在任何偏移量处动态生成给定长度的散列来与修改后的文件一起使用。(从修改文件的开始到结尾)这样它就可以找到不需要传输的 block 。

任何人有任何经验、建议、链接或代码都非常欢迎。Thnx

p.s 我有幸在 php、java 或 c++ 中工作。

我给出的代码用于测试目的,它从同一位置获取 2 个文件(一个修改后的文件,另一个原始文件)从旧文件中提取 block 的哈希值,并将其与新文件中每隔一个偏移量的哈希值进行比较.希望这会有所帮助:

<html>
<body>
<?php
$k=0;
$old_file = file_get_contents('11.jpg');
$new_file = file_get_contents('12.jpg');
$block_length = 2048;
$j = 0;
$md5_hashes_old = array();
$md5_hashes_new = array();
$diff_blocks = array();
$first_char=array();
$k = 0;
while(1){
if($j >strlen($old_file))
break;
$block = substr($old_file,$j,$block_length);
$md5_hashes_old[$k] = md5($block);
$first_char[$k]=$block[0];
$j = $j+$block_length;
$k++;
}
$j = 0;
$k = 0;
$no_of_blocks = sizeof($md5_hashes_old);
echo $no_of_blocks;
$matched_blocks = array();
$matched = 0;
$fc=0;
echo $md5_hashes_old[1].'</br>';
for($i=0;$i<$no_of_blocks;$i++){
$j =0;
while(1){
$block = substr($new_file,$j,$block_length);
$md5_hash = md5($block);
if($md5_hashes_old[$i] == $md5_hash){
$match_block = array();
$match_block['block_no'] = $i;
$match_block['index'] = $j;
array_push($matched_blocks,$match_block);
break;
}
else
$j++;

if($j > strlen($new_file))
break;
echo 'old='.$md5_hashes_old[$i].' i='.$i.' new='.$md5_hash.'</br>';
}
}
print_r($matched_blocks);
?>

</body>
</html>

最佳答案

增加超时时间是您的首要任务。

我假设您只有在修改日期更新且文件长度不同时才进行 md5 比较。

如果您使用的是 C++,则可以使用文件系统观察器在文件被修改时收到通知,然后使用它来触发您的进程或触发哈希的创建。

另一个技巧是缓存文件以进行二进制差异:

http://dev.chromium.org/developers/design-documents/software-updates-courgette

关于java - 同步文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9464854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com