(57)【要約】      （修正有）【課題】  作成時間が短く、作成されるファイルのサイズが小さい、差分ファイル作成技術を提供する。【解決手段】  第１のファイルをそれぞれがｍバイトである複数のブロックに分割し、第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までが第１のファイルのいずれかのブロックと一致する場合は、第２のファイルの（ｒ＋ｍ）バイト目から（ｒ＋２＊ｍ−１）バイト目までが第１のファイルのいずれかのブロックと一致するかを調べる。一方、第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までが第１のファイルのいずれのブロックとも一致しない場合は、第２のファイルの（ｒ＋１）バイト目から（ｒ＋ｍ）バイト目まで第１のファイルのいずれかのブロックと一致するかを調べる。かかる手順を繰り返すことによって、第１のファイルのいずれかのブロックと一致するブロック、及び第１のファイルのいずれのブロックとも一致しない部分を明確にする。【選択図】図７
2005173726.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに
第１のファイルをそれぞれがｍバイトである第１，第２，第３，・・・第ｎの複数のブロックに分割する手順と、
第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までを前記複数のブロックのそれぞれと比較する手順と、
前記第２のファイルの前記ｒバイト目から前記（ｒ＋ｍ−１）バイト目までが前記複数のブロックのいずれかと一致する場合は、
一致するブロックの前記第１のファイルにおける位置を特定可能な情報を差分ファイルに記録するブロック位置記録手順と、
前記第２のファイルの（ｒ＋ｍ）バイト目から（ｒ＋２＊ｍ−１）バイト目までを前記複数のブロックとの新たな比較対象とする手順と、
前記第２のファイルの前記ｒバイト目から前記（ｒ＋ｍ−１）バイト目までが前記ブロックのいずれとも一致しない場合は、
前記ｒバイト目のデータを前記差分ファイルに記録する手順と、
前記第２のファイルの（ｒ＋１）バイト目から前記（ｒ＋ｍ）バイト目までを前記複数のブロックとの新たな比較対象とする手順と、
を実行させるための差分ファイル作成プログラム（ｍ，ｎ及びｒは自然数）。
【請求項２】
前記分割する手順は、前記複数のブロックについてチェックサムテーブルを作成する手順を、
前記比較する手順は、前記ｒバイト目から（ｒ＋ｍ−１）バイト目までのチェックサム値を前記チェックサムテーブル内の各チェックサム値と比較する手順を、
さらに含む請求項１記載の差分ファイル作成プログラム。
【請求項３】
前記ブロック位置記録手順は、
前記第２のファイルの前記ｒバイト目から（ｒ＋ｍ−１）バイト目までが、前記第１のファイルのｐバイト目から（ｐ＋ｍ−１）バイト目までのブロックと一致する場合に、
一致ブロックの開始位置を示す前記ｐバイト目とブロックサイズを示す前記ｍバイト、又は
前記ｐバイト目と一致ブロックの終了位置を示す前記（ｐ＋ｍ−１）バイト目
を差分ファイルに記録する手順を、
さらに含む請求項１又は２記載の差分ファイル作成プログラム（ｐは自然数）。
【請求項４】
前記ブロック位置記録手順は、
前記第２のファイルの前記ｒバイト目から（ｒ＋ｍ−１）バイト目までが、前記第１のファイルのｐバイト目から（ｐ＋ｍ−１）バイト目までのブロックと一致する場合に、
前記第１のファイルにおける一致ブロックの開始位置を示す前記ｐバイト目を、第１の一時記憶領域に、
ブロックサイズを示す前記ｍバイト、又は
前記第１のファイルにおける一致ブロックの終了位置を示す前記（ｐ＋ｍ−１）バイト目を、第２の一時記憶領域に記憶し、
前記第２のファイルの（ｒ＋ｍ）バイト目から（ｒ＋２＊ｍ−１）バイト目までが、前記第１のファイルの（ｐ＋ｍ）バイト目から（ｐ＋２＊ｍ−１）バイト目までのブロックと一致する場合に、前記第２の一時記憶領域に記憶されている
前記ｍバイトにｍバイトを加算、又は
前記（ｐ＋ｍ−１）バイトにｍバイトを加算する手順を繰り返し、
前記第２のファイルの（ｒ＋ｓ＊ｍ）バイト目から（ｒ＋（ｓ＋１）＊ｍ−１）バイト目までが前記第１のファイルのいずれのブロックとも一致しない場合に、
前記第１の一時記憶領域に記憶されている前記ｐバイト目と、
前記第２の一時記憶領域に記憶されている
発見された一致ブロックのブロックサイズの合計を示す（ｍ＊ｓ）バイト又は
最後に発見された一致ブロックの終了位置を示す（ｐ＋ｍ＊ｓ−１）バイト目
とを差分ファイルに記録する手順を、
さらに含む請求項１乃至３のいずれか一項に記載の差分ファイル作成プログラム（ｓは自然数）。
【請求項５】
前記第２のファイルの前記ｒバイト目から（ｒ＋ｍ−１）バイト目までが、前記ブロックのいずれとも一致しない場合に、前記ｒバイト目のデータを第３の一時記憶領域に記憶し、
前記第２のファイルの前記（ｒ＋１）バイト目から前記（ｒ＋ｍ）バイト目までが、前記ブロックのいずれとも一致しない場合に、前記（ｒ＋１）バイト目のデータを第３の一時記憶領域に追加記憶する手順を繰り返し、
前記第２のファイルの（ｒ＋ｔ）バイト目から（ｒ＋ｔ＋ｍ−１）バイト目までが、前記ブロックのいずれかと一致する場合に、前記第３の一時記憶領域に記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータを差分ファイルに記録する請求項１乃至４のいずれか一項に記載の差分ファイル作成プログラム（ｔは自然数）。
【請求項６】
前記ｔがブロックサイズの所定倍数値以上である場合は、前記第３の一時記憶領域に記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータを
前記ｔがブロックサイズの所定倍数値以上でない場合は、前記第３の一時記憶領域に記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータと前記第１のファイルとの厳密差分を、差分ファイルに記録する
請求項５に記載の差分ファイル作成プログラム。
【請求項７】
直前の一致ブロックと現在の一致ブロックとが、第１のファイルにおいて
連続するブロックである場合は、前記第３の一時記憶領域に記憶記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータを
連続するブロックでない場合は、前記第３の一時記憶領域に記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータと前記第１のファイルとの厳密差分を、差分ファイルに記録する
請求項５又は６に記載の差分ファイル作成プログラム。
【請求項８】
直前の一致ブロックと現在の一致ブロックとの、第１のファイルにおける出現順序と第２のファイルにおける出現順序とが、
逆転している場合は、前記第３の一時記憶領域に記憶記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータを
逆転していない場合は、前記第３の一時記憶領域に記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータと前記第１のファイルとの厳密差分を、差分ファイルに記録する
請求項５乃至７のいずれか一項に記載の差分ファイル作成プログラム。
【請求項９】
直前の一致ブロックが、第１のファイルにおいては現在の一致ブロックの後方に存在するが、２つ前の一致ブロックは、第１のファイルにおいても現在の一致ブロックの前方に存在する場合に、前記２つ前の一致ブロックの直後から前記現在の一致ブロックの直前までを不一致部分とみなす請求項１乃至８のいずれか一項に記載の差分ファイル作成プログラム。
【請求項１０】
現在の一致ブロックから前方向の所定距離内に複数の一致ブロックが存在し、前記複数の一致ブロック内に、第１のファイル内においても前記現在の一致ブロックの前方に存在する両ファイル内前方一致ブロックが存在する場合に、
前記両ファイル内前方一致ブロックの直後から前記現在の一致ブロックの直前までを不一致部分とみなす請求項１乃至９のいずれか一項に記載の差分ファイル作成プログラム。
【請求項１１】
第２のファイル内において一致ブロックが発見された場合であって、直前の不一致部分の長さが閾値未満又は閾値以下である場合は、一致ブロックとして処理せず、不一致部分として処理する請求項１乃至１０のいずれか一項に記載の差分ファイル作成プログラム。
【請求項１２】
前記ブロックサイズが、第２のファイルにおける直前の一致ブロックと、第２のファイルにおける現在の一致ブロックとの間に、第１の旧ファイルにおいて存在する１又は２以上のブロックのブロックサイズの合計値である請求項６乃至８のいずれか一項に記載の差分ファイル作成プログラム。
【請求項１３】
記憶手段に、第１のファイルを読み込み、それぞれがｍバイトである第１，第２，第３，・・・第ｎの複数のブロックに分割するステップと、
比較手段が、第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までを前記複数のブロックのそれぞれと比較するステップと、
前記比較手段が、前記第２のファイルの前記ｒバイト目から（ｒ＋ｍ−１）バイト目までが前記複数のブロックのいずれかと一致すると判断した場合は、
一致するブロックの前記第１のファイルにおける位置を特定可能な情報を差分ファイルに記録するブロック位置記録ステップと、
前記第２のファイルの（ｒ＋ｍ）バイト目から（ｒ＋２＊ｍ−１）バイト目までを前記複数のブロックとの新たな比較対象とするステップと、
前記比較手段が、前記第２のファイルの前記ｒバイト目から（ｒ＋ｍ−１）バイト目までが前記ブロックのいずれとも一致しないと判断した場合は、
前記ｒバイト目のデータを前記差分ファイルに記録するステップと、
前記第２のファイルの（ｒ＋１）バイト目から（ｒ＋ｍ）バイト目までを前記複数のブロックとの新たな比較対象とするステップと、
から構成される差分ファイル作成方法（ｍ，ｎ及びｒは自然数）。
【請求項１４】
前記分割するステップは、演算手段が、前記複数のブロックについてチェックサムテーブルを作成するステップを、
前記比較するステップは、前記比較手段が、前記ｒバイト目から（ｒ＋ｍ−１）バイト目までのチェックサム値を前記チェックサムテーブル内の各チェックサム値と比較するステップを、
さらに含む請求項１３記載の差分ファイル作成方法。
【請求項１５】
前記ブロック位置記録ステップは、
前記比較手段が、前記第２のファイルの前記ｒバイト目から（ｒ＋ｍ−１）バイト目までが、前記第１のファイルのｐバイト目から（ｐ＋ｍ−１）バイト目までのブロックと一致すると判断した場合に、
一致ブロックの開始位置を示す前記ｐバイト目とブロックサイズを示す前記ｍバイト、又は
前記ｐバイト目と一致ブロックの終了位置を示す前記（ｐ＋ｍ−１）バイト目
を差分ファイルに記録するステップを、
さらに含む請求項１３又は１４に記載の差分ファイル作成方法（ｐは自然数）。
【請求項１６】
前記ブロック位置記録ステップは、
前記比較手段が、前記第２のファイルの前記ｒバイト目から（ｒ＋ｍ−１）バイト目までが、前記第１のファイルのｐバイト目から（ｐ＋ｍ−１）バイト目までのブロックと一致すると判断した場合に、
前記第１のファイルにおける一致ブロックの開始位置を示す前記ｐバイト目を、第１の一時記憶領域に、
ブロックサイズを示す前記ｍバイト、又は
前記第１のファイルにおける一致ブロックの終了位置を示す前記（ｐ＋ｍ−１）バイト目を、第２の一時記憶領域に記憶し、
前記比較手段が、前記第２のファイルの（ｒ＋ｍ）バイト目から（ｒ＋２＊ｍ−１）バイト目までが、前記第１のファイルの（ｐ＋ｍ）バイト目から（ｐ＋２＊ｍ−１）バイト目までのブロックと一致すると判断した場合に、前記第２の一時記憶領域に記憶されている
前記ｍバイトにｍバイトを加算、又は
前記（ｐ＋ｍ−１）バイトにｍバイトを加算するステップを繰り返し、
前記第２のファイルの（ｒ＋ｓ＊ｍ）バイト目から（ｒ＋（ｓ＋１）＊ｍ−１）バイト目までが前記第１のファイルのいずれのブロックとも一致しない場合に、
前記第１の一時記憶領域に記憶されている前記ｐバイト目と、
前記第２の一時記憶領域に記憶されている
発見された一致ブロックのブロックサイズの合計を示す（ｍ＊ｓ）バイト又は
最後に発見された一致ブロックの終了位置を示す（ｐ＋ｍ＊ｓ−１）バイト目
とを差分ファイルに記録するステップを、
さらに含む請求項１３乃至１５のいずれか一項に記載の差分ファイル作成方法（ｓは自然数）。
【請求項１７】
前記比較手段が、前記第２のファイルの前記ｒバイト目から（ｒ＋ｍ−１）バイト目までが、前記ブロックのいずれとも一致しないと判断した場合に、前記ｒバイト目のデータを第３の一時記憶領域に記憶し、
前記比較手段が、前記第２のファイルの前記（ｒ＋１）バイト目から前記（ｒ＋ｍ）バイト目までが、前記ブロックのいずれとも一致しないと判断した場合に、前記（ｒ＋１）バイト目のデータを第３の一時記憶領域に追加記憶するステップを繰り返し、
前記比較手段が、前記第２のファイルの（ｒ＋ｔ）バイト目から（ｒ＋ｔ＋ｍ−１）バイト目までが、前記ブロックのいずれかと一致すると判断した場合に、前記第３の一時記憶領域に記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータを差分ファイルに記録する請求項１３乃至１６のいずれか一項に記載の差分ファイル作成方法（ｔは自然数）。
【請求項１８】
前記比較手段が、前記ｔがブロックサイズの所定倍数値以上であると判断した場合は、前記第３の一時記憶領域に記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータを
前記比較手段が、前記ｔがブロックサイズの所定倍数値以上でないと判断した場合は、前記第３の一時記憶領域に記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータと前記第１のファイルとの厳密差分を、差分ファイルに記録する請求項１７に記載の差分ファイル作成方法。
【請求項１９】
直前の一致ブロックと現在の一致ブロックとが、第１のファイルにおいて
連続するブロックである場合は、前記第３の一時記憶領域に記憶記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータを
連続するブロックでない場合は、前記第３の一時記憶領域に記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータと前記第１のファイルとの厳密差分を、差分ファイルに記録する
請求項１７又は１８に記載の差分ファイル作成方法。
【請求項２０】
直前の一致ブロックと現在の一致ブロックとの、第１のファイルにおける出現順序と第２のファイルにおける出現順序とが、
逆転している場合は、前記第３の一時記憶領域に記憶記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータを
逆転していない場合は、前記第３の一時記憶領域に記憶されている前記ｒバイト目から前記（ｒ＋ｔ＋ｍ−１）バイト目までのデータと前記第１のファイルとの厳密差分を、差分ファイルに記録する
請求項１７乃至１９のいずれか一項に記載の差分ファイル作成方法。
【請求項２１】
直前の一致ブロックが、第１のファイルにおいては現在の一致ブロックの後方に存在するが、２つ前の一致ブロックは、第１のファイルにおいても現在の一致ブロックの前方に存在する場合に、前記２つ前の一致ブロックの直後から前記現在の一致ブロックの直前までを不一致部分とみなす請求項１３乃至２０のいずれか一項に記載の差分ファイル作成方法。
【請求項２２】
現在の一致ブロックから前方向の所定距離内に複数の一致ブロックが存在し、前記複数の一致ブロック内に、第１のファイル内においても前記現在の一致ブロックの前方に存在する両ファイル内前方一致ブロックが存在する場合に、
前記新旧前方一致ブロックの直後から前記現在の一致ブロックの直前までを不一致部分とみなす請求項１３乃至２１のいずれか一項に記載の差分ファイル作成方法。
【請求項２３】
第２のファイル内において一致ブロックが発見された場合であって、直前の不一致部分の長さが閾値未満又は閾値以下である場合は、一致ブロックとして処理せず、不一致部分として処理する請求項１３乃至２２のいずれか一項に記載の差分ファイル作成方法。
【請求項２４】
前記ブロックサイズが、第２のファイルにおける直前の一致ブロックと、第２のファイルにおける現在の一致ブロックとの間に、第１の旧ファイルにおいて存在する１又は２以上のブロックのブロックサイズの合計値である請求項１７乃至２０のいずれか一項に記載の差分ファイル作成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、旧ファイルと、旧ファイルを更新して得られる新ファイルとの差分ファイルを作成するプログラム及び方法に関する。
【背景技術】
【０００２】
２つのファイルがどの程度異なるのか、のみならず複数のファイルで構成されているシステム全体として他のシステムとどの程度異なっているかを知るための類似度計測システムが存在する（例えば、特許文献１参照）。
【特許文献１】特開２００３−２１６４２５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
従来、２つのファイルの厳密な差分をとる方法として、新ファイルに出現する最長バイト列を旧ファイル全域から探索するＬＣＳ(Longest Character Sequence又はLongest Common Sequence)法や、ＬＣＳ法と等価な機能を持つが、より高速化したSuffix index を使用する方法（例えば、bdiff）や、ハッシュテーブルを使用する方法（例えば、vdelta）などが存在する。
【０００４】
また、厳密差分に比較すると粗い差分をとる方法として、最長一致バイト列ではなく固定長ブロック単位での一致探索を行う方法（例えば、rsyncの亜種）や、最長一致単語をファイル全域ではなくファイルの一部分から局所探索する方法（例えば、LDIFF）などが存在する。
【０００５】
しかし、厳密な差分をとる方法は、差分ファイルのサイズは小さいが、差分ファイルの作成時間が長くなりがちである。一方、ラフな差分をとる方法は、差分ファイル作成時間は短いが、差分ファイルのサイズが大きくなる傾向にある。
【０００６】
そこで、本発明は、ラフな差分をとる方法に近い処理時間で、厳密な差分を取る方法を採用した場合に近いサイズの差分ファイルを抽出可能なプログラム、方法及び装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の第１の特徴は、差分ファイル作成プログラムであって、コンピュータに
（１）第１のファイルをそれぞれがｍバイトである第１，第２，第３，・・・第ｎの複数のブロックに分割する手順と、
（２）第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までを第１のファイルの複数のブロックのそれぞれと比較する手順と、
（３）第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までが第１のファイルの複数のブロックのいずれかと一致する場合は、
（３−１）一致するブロックの第１のファイルにおける位置を特定可能な情報を差分ファイルに記録するブロック位置記録手順と、
（３−２）第２のファイルの（ｒ＋ｍ）バイト目から（ｒ＋２＊ｍ−１）バイト目までを第１のファイルの複数のブロックとの新たな比較対象とする手順と、
（４）第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までが第１のファイルのブロックのいずれとも一致しない場合は、
（４−１）ｒバイト目のデータを差分ファイルに記録する手順と、
（４−２）第２のファイルの（ｒ＋１）バイト目から（ｒ＋ｍ）バイト目までを第１のファイルの複数のブロックとの新たな比較対象とする手順と、を実行させることにある（ｍ，ｎ及びｒは自然数）。
【０００８】
かかる特徴によって、第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までが第１のファイルのいずれかのブロックと一致する場合は、第２のファイルの（ｒ＋ｍ）バイト目から（ｒ＋２＊ｍ−１）バイト目までが第１のファイルのいずれかのブロックと一致するかを調べる。一方、第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までが第１のファイルのいずれのブロックとも一致しない場合は、第２のファイルの（ｒ＋１）バイト目から（ｒ＋ｍ）バイト目まで第１のファイルのいずれかのブロックと一致するかを調べる。
【０００９】
かかる手順を繰り返すことによって、第２のファイルに関して、第１のファイルのいずれかのブロックと一致するブロック、及び第１のファイルのいずれのブロックとも一致しない部分を明確にする。
【００１０】
本発明の第２の特徴は、（１）第１のファイルを複数のブロックに分割する手順は、各ブロックのチェックサムが記録されたチェックサムテーブルを作成する手順を、
（２）第１のファイルのブロックと比較する手順は、第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までのチェックサム値を、既に作成してあるチェックサムテーブル内の各チェックサム値と比較する手順を、含むことにある。
【００１１】
本発明の第３の特徴は、さらにブロック位置記録手順が、第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までが、第１のファイルのｐバイト目から（ｐ＋ｍ−１）バイト目までのブロックと一致する場合に、
一致ブロックの開始位置を示すｐバイト目とブロックサイズを示すｍバイト、又は
ｐバイト目と一致ブロックの終了位置を示す（ｐ＋ｍ−１）バイト目
を差分ファイルに記録する手順を、さらに含むことにある（ｐは自然数）。
【００１２】
かかる特徴によって、第２のファイル中に存在する一致ブロックが、第１のファイル中のどのブロックと一致するかを記録する。
【００１３】
本発明の第４の特徴は、ブロック位置記録手順が、
（１）第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までが、第１のファイルのｐバイト目から（ｐ＋ｍ−１）バイト目までのブロックと一致する場合に、
（１−１）第１のファイルにおける一致ブロックの開始位置を示すｐバイト目を、第１の一時記憶領域に、
（１−２）ブロックサイズを示すｍバイト、又は第１のファイルにおける一致ブロックの終了位置を示す（ｐ＋ｍ−１）バイト目を、第２の一時記憶領域に記憶し、
（２）第２のファイルの（ｒ＋ｍ）バイト目から（ｒ＋２＊ｍ−１）バイト目までが、第１のファイルの（ｐ＋ｍ）バイト目から（ｐ＋２＊ｍ−１）バイト目までのブロックと一致する場合に、第２の一時記憶領域に記憶されている
（２−１）ｍバイトにｍバイトを加算、又は
（２−２）（ｐ＋ｍ−１）バイトにｍバイトを加算する手順を繰り返し、
（３）第２のファイルの（ｒ＋ｓ＊ｍ）バイト目から（ｒ＋（ｓ＋１）＊ｍ−１）バイト目までが第１のファイルのいずれのブロックとも一致しない場合に、
（３−１）第１の一時記憶領域に記憶されているｐバイト目と、
（３−２）第２の一時記憶領域に記憶されている
発見された一致ブロックのブロックサイズの合計を示す（ｍ＊ｓ）バイト又は
最後に発見された一致ブロックの終了位置を示す（ｐ＋ｍ＊ｓ−１）バイト目
とを差分ファイルに記録する手順を、さらに含むことにある（ｓは自然数）。
【００１４】
かかる特徴によって、一致ブロックが連続して存在する場合に、最初の一致ブロック、次の一致ブロック、さらにその次の一致ブロック・・・など各ブロックの位置を特定可能な情報を逐一記録するのではなく、連続するブロックの最初のブロックと最後のブロックの位置を特定可能な情報を記録する。
【００１５】
本発明の第５の特徴は、
（１）第２のファイルのｒバイト目から（ｒ＋ｍ−１）バイト目までが、第１のファイルのブロックのいずれとも一致しない場合に、ｒバイト目のデータを第３の一時記憶領域に記憶し、
（２）第２のファイルの（ｒ＋１）バイト目から（ｒ＋ｍ）バイト目までが、第１のファイルのブロックのいずれとも一致しない場合に、（ｒ＋１）バイト目のデータを第３の一時記憶領域に追加記憶する手順を繰り返し、
（３）第２のファイルの（ｒ＋ｔ）バイト目から（ｒ＋ｔ＋ｍ−１）バイト目までが、第１のファイルのブロックのいずれかと一致する場合に、第３の一時記憶領域に記憶されているｒバイト目から（ｒ＋ｔ＋ｍ−１）バイト目までのデータを差分ファイルに記録することにある（ｔは自然数）。
【００１６】
かかる特徴によって、一致ブロックが発見されない間は第２のファイルのｒバイト目のデータ、（ｒ＋１）バイト目のデータ、・・・の各データが一時記憶領域に順次記憶され、（ｒ＋ｔ）バイト目を先頭とする一致ブロックが発見された時に、それまで一時記憶領域に蓄積されていた記憶内容が差分ファイルに記録される。
【００１７】
本発明の第６の特徴は、
（１）ｔがブロックサイズの第１の所定倍数値以上若しくは第１の所定倍数値より大又は第２の所定倍数値以下若しくは第２の所定倍数値未満である場合は、第３の一時記憶領域に記憶されているｒバイト目から（ｒ＋ｔ＋ｍ−１）バイト目までのデータを
（２）ｔがブロックサイズの第１の所定倍数値以上若しくは第１の所定倍数値より大又は第２の所定倍数値以下若しくは第２の所定倍数値未満でない場合は、第３の一時記憶領域に記憶されているｒバイト目から（ｒ＋ｔ＋ｍ−１）バイト目までのデータと第１のファイルとの厳密差分を、差分ファイルに記録することにある。
【００１８】
かかる特徴によって、不一致部分の長さを示すｔの値が、ブロックサイズに比べて大きすぎる場合、又は小さすぎる場合には、一時記憶領域に記憶されているデータをそのまま差分ファイルに記録し、不一致部分の長さを示すｔの値が、ブロックサイズに比べて大きすぎない場合、又は小さすぎない場合には、厳密差分を差分ファイルに記録する。
【００１９】
本発明の第７の特徴は、直前の一致ブロックと現在の一致ブロックとが、第１のファイルにおいて
（１）連続するブロックである場合は、第３の一時記憶領域に記憶記憶されているｒバイト目から（ｒ＋ｔ＋ｍ−１）バイト目までのデータを
（２）連続するブロックでない場合は、第３の一時記憶領域に記憶されているｒバイト目から（ｒ＋ｔ＋ｍ−１）バイト目までのデータと第１のファイルとの厳密差分を、差分ファイルに記録することにある。
【００２０】
つまり、第２のファイルにおいて不一致部分の前に存在する一致ブロックと後ろに存在する一致ブロックが、第１のファイルにおいて連続するブロックである場合は、厳密差分をとらない。
【００２１】
本発明の第８の特徴は、直前の一致ブロックと現在の一致ブロックとの、第１のファイルにおける出現順序と第２のファイルにおける出現順序とが、
（１）逆転している場合は、第３の一時記憶領域に記憶記憶されているｒバイト目から（ｒ＋ｔ＋ｍ−１）バイト目までのデータを
（２）逆転していない場合は、第３の一時記憶領域に記憶されているｒバイト目から（ｒ＋ｔ＋ｍ−１）バイト目までのデータと第１のファイルとの厳密差分を、差分ファイルに記録することにある。
【００２２】
つまり、第２のファイルにおいて不一致部分の前に存在する一致ブロックをブロックＡとし、後ろに存在する一致ブロックをブロックＢとする場合に、第１のファイルにおいてブロックＢがブロックＡの前に位置する場合は、厳密差分をとらない。
【００２３】
本発明の第９の特徴は、直前の一致ブロックが、第１のファイルにおいては現在の一致ブロックの後方に存在するが、２つ前の一致ブロックは、第１のファイルにおいても現在の一致ブロックの前方に存在する場合に、
２つ前の一致ブロックの直後から現在の一致ブロックの直前までを不一致部分とみなすことにある。この場合、１つ前の一致ブロックは、不一致部分の一部とみなされる。
【００２４】
本発明の第１０の特徴は、現在の一致ブロックから前方向の所定距離内に複数の一致ブロックが存在し、複数の一致ブロック内に、第１のファイル内においても現在の一致ブロックの前方に存在する両ファイル内前方一致ブロックが存在する場合に、
両ファイル内前方一致ブロックの直後から現在の一致ブロックの直前までを不一致部分とみなすことにある。この場合、第２のファイルにおいて、両ファイル内前方一致ブロックと現在の一致ブロックとの間に存在する一致ブロックは、不一致部分の一部とみなされる。
【００２５】
本発明の第１１の特徴は、第２のファイル内において一致ブロックが発見された場合であって、直前の不一致部分の長さが閾値未満又は閾値以下である場合は、一致ブロックとして処理せず、不一致部分として処理することにある。
【００２６】
本発明の第１２の特徴は、ブロックサイズが、第２のファイルにおける直前の一致ブロックと、第２のファイルにおける現在の一致ブロックとの間に、第１のファイルにおいて存在する１又は２以上のブロックのブロックサイズの合計値であることにある。
【発明の効果】
【００２７】
本発明の特徴によれば、差分ファイの生成プログラム及び方法は、ブロック単位のラフな差分抽出の「差分ファイル作成速度が高速」という長所と、厳密差分の「差分ファイルのサイズが小さい」という長所を兼ね備えることが可能である。
【発明を実施するための最良の形態】
【００２８】
以下に詳述するよう、本発明の実施例においては、旧ファイルと新ファイルとを基に、両ファイルの差分ファイルを作成する。差分ファイルには、新ファイルと旧ファイルとではどこがどのように違うかに関する情報が書かれている。このため、旧ファイルと差分ファイルがあれば、新ファイルを作成することができる。
【００２９】
図１は、実施例１〜３の差分ファイル作成装置の構成を示す。まず、各実施例に共通な部分について説明する。その後、各実施例の特徴的な部分について説明する。図１に示すように、実施例１〜３の差分ファイル作成装置３は、送信部１０と、演算処理装置（ＣＰＵ）２０と、記憶部３０とを備える。
【００３０】
送信部１０は、インターネット等の通信網４０を介してリモートサイト５０へ差分ファイルを送信する。ＣＰＵ２０は、各種プログラムが示す手順に従って新旧ファイルからデータを読み取り、差分ファイルを作成する。
【００３１】
記憶部３０は、旧ファイル、新ファイル、差分ファイル、ブロックバイナリ差分抽出プログラム（ブロック差分抽出プログラム）、厳密バイナリ差分抽出プログラム（厳密差分抽出プログラム）、ハイブリッド差分抽出プログラム、過去の成績情報、デフォルトパラメータテーブル、チェックサムテーブル、旧ファイルオフセット、新ファイルオフセットなどを記憶し、またブロックバイト数一時記憶領域、不一致部分一時記憶領域などを有する。また、図示しない、ＢＩＯＳ、オペレーティングシステム（ＯＳ）、差分ファイル送信プログラムなども記憶する。記憶部３０は、リードオンリーメモリー（ＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）、ハードディスクドライブ（ＨＤＤ）などから構成される。
【００３２】
ハイブリッド差分抽出プログラムとは、ｒｓｙｎｃなどのブロック差分抽出プログラムとｂｄｉｆｆやｖｄｅｌｔａなどの厳密差分抽出プログラムとを適宜使い分けることによって、できるだけ小さな差分ファイルをできるだけ短時間に作成するためのプログラムである。
【００３３】
過去の成績情報とは、かかるハイブリッド差分抽出プログラムを用いて差分ファイルを過去に作成した際の条件や結果を記録したものである。例えば、そのプログラムを実行した時刻、旧ファイルの名前、新ファイルの名前、旧ファイルのサイズ、新ファイルのサイズ、差分ファイルのサイズ、圧縮後差分ファイルのサイズ、実行時間、実行パラメータなどである。
【００３４】
デフォルトパラメータテーブルとは、過去の成績情報が存在しない場合などに、予め定めた振り分け条件から、各実行パラメータを決定するために必要な情報が書かれたテーブルである。
【００３５】
図２は、自己チューニング機能付き差分抽出処理の全体の流れを示す。ステップＳ１０では、過去の成績情報を取得する。ステップＳ２０では、対象ファイル情報を取得し、実行パラメータを自動的に設定する。過去の成績情報を取得できた場合は、過去の成績情報とデフォルトパラメータテーブルに基づいて、最適な実行パラメータを探索する。過去の成績情報を取得できなかった場合は、デフォルトパラメータテーブルに基づいて、実行パラメータを設定する。ステップＳ３０では、差分抽出主処理を行う。ステップＳ４０では、成績情報を保存する。
【００３６】
図３は、対象ファイル情報の取得と実行パラメータ自動設定の流れを示す。ステップＳ２１では、対象ファイルの情報を取得する。ステップＳ２２では、過去成績情報を探索する。ステップＳ２３では、対象ファイル情報と類似のファイル情報がある場合はステップＳ２４へ進み、そうでない場合はステップＳ２５へ進む。ステップＳ２４では、該当過去成績情報のパラメータを、実行パラメータとしてセットする。該当過去成績情報とは、対象ファイル情報と類似のファイル情報を意味する。ステップＳ２５では、デフォルト値テーブルに記憶されているパラメータ値を、実行パラメータとしてセットする。
【００３７】
図４は、デフォルト値テーブルの一例を示す。図４の例では、ファイル拡張子と新ファイルのサイズを振り分け条件としている。ファイル拡張子が、gz, zip, Z, LZH, jarなどの場合は、差分抽出に適さないことを示す。また、ファイル拡張子が、exe, lib, bin, class, dllなどであって、かつ新ファイルのサイズが１００メガバイト（ＭＢ）より大の場合は、ブロックバイナリ差分抽出Ｏｎｌｙパラメータ値をＮｏ、厳密バイナリ差分抽出Ｏｎｌｙパラメータ値をＮｏ、ブロック長を２０００バイト（Ｂ）、厳密差分切り取りサイズを４００００バイト、厳密差分適用上限サイズ比（新ファイル：旧ファイル）を３とすることを示す。
【００３８】
厳密差分切り取りサイズとは、本発明の第１１の特徴として述べた、第２のファイル内において一致ブロックが発見された場合であって、直前の不一致部分の長さが閾値未満又は閾値以下である場合は、一致ブロックとして処理せず、不一致部分として処理する場合の外部から設定可能な閾値のことで、厳密差分をとる際の比較するファイル断片の大きさを調節するためのパラメータである。この閾値を大きくすれば、厳密差分の対象となるファイルの断片は大きくなり、小さくすれば断片は小さくなる。このパラメータを調整することによってファイルの変更の性質（例えば、一部広い範囲で非常に細かい修正がある場合などは、このパラメータを大きくすると効果が高い場合がある）に最適な差分抽出をすることができる。
【００３９】
厳密差分適用上限サイズ比とは、本発明の第６の特徴として述べた、不一致部分の長さを示すｔの値が、ブロックサイズに比べて大きすぎる場合、又は小さすぎる場合には、一時記憶領域に記憶されているデータをそのまま差分ファイルに記録し、不一致部分の長さを示すｔの値が、ブロックサイズに比べて大きすぎない場合、又は小さすぎない場合には、厳密差分を差分ファイルに記録するときの判断基準となるサイズ比のことで、調節可能なパラメータである。ファイルの変更の性質により、このパラメータを調節することで、最適な差分抽出をすることができる。
【００４０】
図５は、差分抽出主処理の流れを示す。ステップＳ３１では、差分抽出適正のパラメータ値がある場合はステップＳ３２へ進み、差分抽出適正のパラメータ値がない場合は処理を終了する。
【００４１】
ステップＳ３２では、ブロックバイナリ差分抽出Onlyパラメータ値がTrueである場合はステップＳ３４へ進み、そうでない場合はステップＳ３３へ進む。
【００４２】
ステップＳ３３では、厳密バイナリ差分抽出Onlyパラメータ値がTrueである場合はステップＳ３５へ進み、そうでない場合はステップＳ１００へ進む。
【００４３】
ステップＳ３４では、rsyncなどを用いてブロックバイナリ差分抽出処理が行われる。ステップＳ３５では、bdiffやvdeltaなどを用いてブロックバイナリ差分抽出処理が行われる。ステップＳ１００では、ハイブリッド差分抽出処理が行われる。ハイブリッド差分抽出処理については、実施例１〜３に分けて説明する。実施例１〜３は、ハイブリッド差分抽出処理中の「一致ブロック発見時処理」が相違する。
【実施例１】
【００４４】
（ハイブリッド差分抽出処理）
まず、各変数を設定する。変数には、新ファイルにおけるOffset、旧ファイルにおける不一致部分の開始位置、新ファイルにおいて発見されたブロックと同じブロックの旧ファイルにおける先頭バイトなどが含まれる。
【００４５】
以下の処理の概要を説明する。まず、旧ファイルを複数の固定長のブロックに分割する。ブロックの長さは、特に限定されない。差分を取る対象である旧ファイル、新ファイルの種類に応じて決めても良い。例えば、実行ファイルなどであればブロックの長さを２０００バイトとし、テキストファイルなどであれば２００バイトとし、データベースファイルであれば１０２４バイトとする。また、旧ファイル、新ファイルのバイト数に応じて決めても良い。
【００４６】
旧ファイルのブロックと新ファイルのブロックは長さを等しくする。例えば、旧ファイルのブロックの長さを１０００バイトとしたら、新ファイルのブロックの長さも１０００バイトとする。
【００４７】
次に、旧ファイル中のブロックのいずれかと同じブロックが、新ファイル中に存在する場合は、旧ファイル中のどのブロックと同じであるかを特定できる情報を差分ファイルに出力する。
【００４８】
「旧ファイル中のどのブロックと同じであるかを特定できる情報」とは、例えば、
（１）旧ファイル中にも存在するブロックの先頭バイトが旧ファイルの先頭から数えて何バイト目かを示すバイト数、
（２）旧ファイル中の各ブロックのそれぞれに番号が付与されている場合は、そのブロックの番号、などである。
【００４９】
旧ファイル中のいずれのブロックとも一致しない部分は、その部分のデータを差分ファイルに出力する。
【００５０】
例えば、１ブロックを３バイトとし、１バイトを英字半角１文字で、１ブロックを英字半角３文字で示す。
【００５１】
図６（ａ）に旧ファイルの一例を、図（ｂ）に新ファイルの一例を、図６（ｃ）に実施例１にかかる差分ファイルを、図６（ｄ）〜（ｅ）に後述する実施例２〜３にかかる差分ファイルを、それぞれ示す。
【００５２】
まず、新ファイルの１〜３バイトを旧ファイルのAAAブロック、BBBブロック、CCCブロックなどの各ブロックと比較する。新ファイルの１〜３バイトは、旧ファイルの１〜３バイトと同じである。よって、差分ファイルに、AAAブロックの先頭バイトが旧ファイルの先頭から１バイト目であることを書き込むか、またはAAAブロックが旧ファイルの第１ブロックであることを書き込む。
【００５３】
なお、図６（ａ）に示す旧ファイルは、１〜３バイトは全てA、４〜６バイトは全てＢというように、各ブロックの中身が同じであるが、これは単に説明の都合上そうしているに過ぎない。例えば、ブロック長を８バイトとし、AAABBBCCなどのように中身が同じでないまとまりを一つのブロックとしても良い。
【００５４】
次に、新ファイルの４〜６バイトを各ブロックと比較する。新ファイルの４〜６バイトは、旧ファイルのいずれのブロックとも一致しないので新ファイルの４バイト目のデータ"Y"が差分ファイルに書き込まれる。
【００５５】
一致ブロックが発見されたらすぐに、一致ブロックに関するデータを差分ファイルに書き込むとしても良いが、一致ブロックに関するデータを差分ファイルに書き込むタイミングは、特に限定されない。同様に、不一致部分に関するデータを書き込むタイミングも特に限定されない。
【００５６】
図７はハイブリッド差分抽出処理の流れを示すフローチャートであり、図８は実施例１における一致ブロック発見時処理の流れを示すフローチャートである。
【００５７】
図７及び図８に沿って、実施例１におけるハイブリッド差分抽出処理の内容を具体的に説明する。
【００５８】
ステップＳ１０１：各変数が設定される。
【００５９】
ステップＳ１０２：旧ファイルの各ブロックのチェックサムテーブルＡが作成される。
【００６０】
ステップＳ１０３：新ファイルのOffsetに「１」が入力される。
【００６１】
（新ファイルのOffset＝１バイト）
ステップＳ１１２：新ファイルの１〜３バイト（AAA）のチェックサムは、チェックサムテーブル内に発見され、ＹＥＳに分岐する。図８に示す一致ブロック発見時処理を開始する。
【００６２】
ステップＳ２０１：直前は不一致部分ではないので、ＮＯに分岐する。
【００６３】
ステップＳ２０２：直前は一致ブロックではないから、ＮＯに分岐する。
【００６４】
ステップＳ２０３：発見ブロック、つまり一致ブロック（AAA）の旧ファイルにおける先頭位置（１バイト目）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの先頭に「１」が書き込まれる。
【００６５】
ステップＳ２０４：ブロックバイト数（３バイト）をブロックバイト数一時記憶領域に出力する。
【００６６】
ステップＳ２０５：新ファイルのOffset（１バイト）にブロックサイズ（３バイト）を加える。新ファイルのOffsetは、４バイトになる。
【００６７】
一致ブロック発見時処理を終了する。
【００６８】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【００６９】
（新ファイルのOffset＝４バイト）
ステップＳ１１１：新ファイルの４〜６バイトのチェックサムを算出する。
【００７０】
ステップＳ１１２：新ファイルの４〜６バイト（YZB）のチェックサムは、チェックサムテーブル内にて発見されないので、ＮＯに分岐する。
【００７１】
ステップＳ１１３：直前は一致ブロックであるから、ＹＥＳに分岐する。
【００７２】
ステップＳ１１４：ブロックバイト数一時記憶領域の値（３バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１」の後ろに「３」が書き込まれる。
【００７３】
ステップＳ１１５：新ファイルのOffset（４バイト）の内容（Y）を不一致部分一時記憶領域に出力する。
【００７４】
ステップＳ１１６：新ファイルのOffset（４バイト）に１バイトを加える。新ファイルのOffsetは、５バイトになる。
【００７５】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【００７６】
（新ファイルのOffset＝５バイト）
ステップＳ１１２：新ファイルの５〜７バイト（ZBB）のチェックサムは、チェックサムテーブル内にて発見されないので、ＮＯに分岐する。
【００７７】
ステップＳ１１３：直前は一致ブロックではないので、ＮＯに分岐する。
【００７８】
ステップＳ１１５：新ファイルのOffset（５バイト目）の内容（Z）を不一致部分一時記憶領域に出力する。
【００７９】
ステップＳ１１６：新ファイルのOffset（５バイト）に１バイトを加える。新ファイルのOffsetは、６バイトになる。
【００８０】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【００８１】
（新ファイルのOffset＝６バイト）
ステップＳ１１２：新ファイルの６〜８バイト（BBB）のチェックサムは、チェックサムテーブル内にて発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【００８２】
ステップＳ２０１：直前は不一致部分なので、ＹＥＳに分岐する。
【００８３】
なお、直前が不一致部分である場合に、所定条件下で発見された一致ブロックを不一致部分とみなすとしても良い。所定条件には、直前の不一致部分の長さが閾値ｄ以下又は閾値ｄ未満であることが含まれる。そして、直前の不一致部分の長さが閾値ｄ以下又は閾値ｄ未満である場合は、「一致ブロック発見時処理」を中止し、ステップＳ１１５へ進み、不一致部分が続いているものとして処理する。一方、直前の不一致部分の長さが閾値ｄ以上又は閾値ｄより大である場合は、「一致ブロック発見時処理」を継続し、ステップ２１１へ進む。
【００８４】
例えば、所定条件は直前の不一致部分が閾値ｄ以下、閾値ｄは３バイト、とする。すると、新ファイルのOffsetが６バイトである時に、一致ブロックBBBが発見され、直前の不一致部分YZが３バイト以下であるから、ステップＳ１１５へ進み、新ファイルの６バイト目のBが不一致部分一時記憶領域に追加出力される。
【００８５】
ステップＳ２１１：不一致部分に関する情報であることを示す識別子（例えば、−１）と共に、不一致部分のバイト数（２バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３」の後ろに「−２」が書き込まれる。
【００８６】
ステップＳ２１２：不一致部分一時記憶領域の内容（YZ）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２」の後ろに「YZ」が書き込まれる。
【００８７】
ステップＳ２２３：発見ブロック（BBB）の旧ファイルでのOffset（４バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ」の後ろに「４」が書き込まれる。
【００８８】
ステップＳ２０４：ブロックバイト数（３バイト）をブロックバイト数一時記憶領域に加算する。ブロックバイト数一時記憶領域の値は、０バイトから３バイトに増加する。
【００８９】
ステップＳ２０５：新ファイルのOffset（６バイト）にブロックサイズ（３バイト）を加えて、新ファイルの新たなOffset（９バイト）とする。
【００９０】
一致ブロック発見時処理を終了する。
【００９１】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【００９２】
（新ファイルのOffset＝９バイト）
ステップＳ１１２：新ファイルの９〜１１バイト（CCC）のチェックサムは、チェックサムテーブル内にて発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【００９３】
ステップＳ２０１：直前は不一致部分ではないので、ＮＯに分岐する。
【００９４】
ステップＳ２０２：直前は一致ブロックであるから、ＹＥＳに分岐する。
【００９５】
ステップＳ２２１：直前の一致ブロックと現在の一致ブロックとは旧ファイルにおいて連続するから、ＹＥＳに分岐する。
【００９６】
ここで、「現在の一致ブロック」とは、新ファイルにおけるOffsetが先頭バイトとなっている一致ブロックを言う。「直前の一致ブロック」とは、現在の一致ブロックが発見される直前に発見された一致ブロックを言う。
【００９７】
具体的には、新ファイルにおけるOffsetが６バイト目である場合、現在の一致ブロックとは６〜８バイトのブロック（BBB）のことであり、直前の一致ブロックとは１〜３バイトのブロック（ＡＡＡ）のことである。
【００９８】
また、新ファイルにおけるOffsetが９バイト目である場合、現在の一致ブロックとは９〜１１バイトのブロック（CCC）のことであり、直前の一致ブロックとは６〜８バイトのブロック（BBB）のことである。
【００９９】
「直前の一致ブロックと現在の一致ブロックとが旧ファイルにおいて連続？」とは、直前の一致ブロックと現在の一致ブロックとが旧ファイルにおいて連続するブロックか否かということを意味する。
【０１００】
具体的には、新ファイルにおけるOffsetが６バイト目である場合、現在の一致ブロック（BBB）と、直前の一致ブロック（ＡＡＡ）とは、旧ファイルにおいて連続している。
【０１０１】
一方、新ファイルにおけるOffsetが２２バイト目である場合、現在の一致ブロック（２２〜２４バイトのブロックＩＩＩ）と、直前の一致ブロック（９〜１１バイトのブロックＣＣＣ）とは、旧ファイルにおいて連続していない。
【０１０２】
ステップＳ２０４：ブロックバイト数（３バイト）をブロックバイト数一時記憶領域に加算する。ブロックバイト数一時記憶領域の値は、６バイトになる。
【０１０３】
ステップＳ２０５：新ファイルのOffset（９バイト）にブロックサイズ（３バイト）を加算する。新ファイルのOffsetは、１２バイトになる。
【０１０４】
一致ブロック発見時処理を終了する。
【０１０５】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【０１０６】
（新ファイルのOffset＝１２バイト）
ステップＳ１１２：新ファイルの１２〜１４バイト（DXD）のチェックサムは、チェックサムテーブル内にて発見されないので、ＮＯに分岐する。
【０１０７】
ステップＳ１１３：直前は一致ブロックであるから、ＹＥＳに分岐する。
【０１０８】
ステップＳ１１４：ブロックバイト数一時記憶領域の値（６バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４」の後ろに「６」が書き込まれる。
【０１０９】
ステップＳ１１５：新ファイルのOffset（１２バイト目）の内容（D）を不一致部分一時記憶領域に出力する。
【０１１０】
ステップＳ１１６：新ファイルのOffset（１２バイト）に１バイトを加算する。新ファイルのOffsetは、１３バイトになる。
【０１１１】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【０１１２】
（新ファイルのOffset＝１３〜２１バイト）
ステップＳ１１２：新ファイルの１３〜１５バイト（XDE）のチェックサムは、チェックサムテーブル内にて発見されないので、ＮＯに分岐する。
【０１１３】
ステップＳ１１３：直前は一致ブロックではないから、ＮＯに分岐する。
【０１１４】
ステップＳ１１５：新ファイルのOffset（１３バイト目）の内容（Ｘ）を不一致部分一時記憶領域に出力する。
【０１１５】
ステップＳ１１６：新ファイルのOffset（１３バイト）に１バイトを加算する。新ファイルのOffsetは、１４バイトになる。
【０１１６】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【０１１７】
以下、同様に、
新ファイルの１４〜１６バイト（DEX）のチェックサムはチェックサムテーブル内に発見されないので、先頭１バイト(D)を不一致部分一時記憶領域に出力する。
【０１１８】
新ファイルの１５〜１７バイト（EXE）のチェックサムはチェックサムテーブル内に発見されないので、先頭１バイト(E)を不一致部分一時記憶領域に出力する。
【０１１９】
新ファイルの１６〜１８バイト（XEF）のチェックサムはチェックサムテーブル内に発見されないので、先頭１バイト(X)を不一致部分一時記憶領域に出力する。
【０１２０】
新ファイルの１７〜１９バイト（EFX）のチェックサムはチェックサムテーブル内に発見されないので、先頭１バイト(E)を不一致部分一時記憶領域に出力する。
【０１２１】
新ファイルの１８〜２０バイト（FXX）のチェックサムはチェックサムテーブル内に発見されないので、先頭１バイト(F)を不一致部分一時記憶領域に出力する。
【０１２２】
新ファイルの１９〜２１バイト（XXF）のチェックサムはチェックサムテーブル内に発見されないので、先頭１バイト(X)を不一致部分一時記憶領域に出力する。
【０１２３】
新ファイルの２０〜２２バイト（XFI）のチェックサムはチェックサムテーブル内に発見されないので、先頭１バイト(X)を不一致部分一時記憶領域に出力する。
【０１２４】
新ファイルの２１〜２２バイト（FII）のチェックサムはチェックサムテーブル内に発見されないので、先頭１バイト(F)を不一致部分一時記憶領域に出力する。
【０１２５】
（新ファイルのオフセット＝２２バイト）
ステップＳ１１２：新ファイルの２２〜２４バイト（III）のチェックサムは、チェックサムテーブル内にて発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【０１２６】
ステップＳ２０１：直前は不一致部分であるから、ＹＥＳに分岐する。
【０１２７】
ステップＳ２１１：不一致部分に関する情報であることを示す識別子（例えば、−１）と共に、不一致部分のバイト数（つまり、１２バイト目のDから２１バイト目のＦまでの１０バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４，６」の後ろに「−１０」が書き込まれる。
【０１２８】
ステップＳ２１２：不一致部分一時記憶領域の内容（つまり、DXDEXEFXXF）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０」の後ろに「DXDEXEFXXF」が書き込まれる。
【０１２９】
ステップＳ２２３：発見ブロック（III）の旧ファイルでのOffset（２５バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，DXDEXEFXXF」の後ろに「２５」が書き込まれる。
【０１３０】
ステップＳ２０４：ブロックバイト数（３バイト）をブロックバイト数一時記憶領域に加算する。ブロックバイト数一時記憶領域の値は、３バイトになる。
【０１３１】
ステップＳ２０５：新ファイルのOffset（２２バイト）にブロックサイズ（３バイト）を加算する。新ファイルのOffsetは、２５バイトになる。
【０１３２】
一致ブロック発見時処理を終了する。
【０１３３】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【０１３４】
（新ファイルのオフセット＝２５バイト）
ステップＳ１１２：新ファイルの２５〜２７バイト（HXH）のチェックサムは、チェックサムテーブル内にて発見されないので、ＮＯに分岐する。
【０１３５】
ステップＳ１１３：直前は一致ブロックであるから、ＹＥＳに分岐する。
【０１３６】
ステップＳ１１４：ブロックバイト数一時記憶領域の値（３バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，DXDEXEFXXF，２５」の後ろに「３」が書き込まれる。
【０１３７】
ステップＳ１１５：新ファイルのOffset（２５バイト）の内容（H）を不一致部分一時記憶領域に出力する。
【０１３８】
ステップＳ１１６：新ファイルのOffset（２５バイト）に１バイトを加算する。新ファイルの新たなOffsetは、２６バイトになる。
【０１３９】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【０１４０】
（新ファイルのOffset＝２６〜２７バイト）
ステップＳ１１２：新ファイルの２６〜２８バイト（XHG）のチェックサムは、チェックサムテーブル内にて発見されないので、ＮＯに分岐する。
【０１４１】
ステップＳ１１３：直前は一致ブロックではないので、ＮＯに分岐する。
【０１４２】
ステップＳ１１５：新ファイルのOffset（２６バイト）の内容（X）を不一致部分一時記憶領域に出力する。
【０１４３】
同様に、新ファイルの２７〜２９バイト（HGG）のチェックサムはチェックサムテーブル内に発見されないので、先頭１バイト（H）を不一致部分一時記憶領域に出力する。
【０１４４】
（新ファイルのOffset＝２８バイト）
ステップＳ１１２：新ファイルの２８〜３０バイト（GGG）のチェックサムは、チェックサムテーブル内にて発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【０１４５】
ステップＳ２０１：直前は不一致部分であるから、ＹＥＳに分岐する。
【０１４６】
ステップＳ２１１：不一致部分に関する情報であることを示す識別子（例えば、−１）と共に、不一致部分のバイト数（つまり、２５バイト目のＨから２７バイト目のＨまでの３バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，DXDEXEFXXF，２５，３」の後ろに「−３」が書き込まれる。
【０１４７】
ステップＳ２１２：不一致部分一時記憶領域の内容（つまり、HXH）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，DXDEXEFXXF，２５，３，−３」の後ろに「HXH」が書き込まれる。
【０１４８】
ステップＳ２２３：発見ブロックの旧ファイルでのOffset（１９バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，DXDEXEFXXF，２５，３，−３，HXH」の後ろに「１９」が書き込まれる。
【０１４９】
ステップＳ２０４：ブロックバイト数（３バイト）をブロックバイト数一時記憶領域に出力する。ブロックバイト数一時記憶領域の値は、３バイトになる。
【０１５０】
ステップＳ２０５：新ファイルのOffset（２８バイト）にブロックサイズ（３バイト）を加算する。新ファイルのOffsetは、３１バイトになる。
【０１５１】
一致ブロック発見時処理を終了する。
【０１５２】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【０１５３】
（新ファイルのOffset＝３１バイト）
ステップＳ１１２：新ファイルの３１〜３３バイト（JJJ）のチェックサムは、チェックサムテーブル内にて発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【０１５４】
ステップＳ２０１：直前は不一致部分ではないので、ＮＯに分岐する。
【０１５５】
ステップＳ２０２：直前は一致ブロックであるから、ＹＥＳに分岐する。
【０１５６】
ステップＳ２２１：直前の一致ブロックと現在の一致ブロックとは旧ファイルにおいて連続しないので、ＮＯに分岐する。
【０１５７】
ステップＳ２２２：ブロックバイト数一時記憶領域の値（３バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，DXDEXEFXXF，２５，３，−３，HXH，１９」の後ろに「３」が書き込まれる。
【０１５８】
ステップＳ２２３：発見ブロック(JJJ)の旧ファイルでのOffset（２８バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，DXDEXEFXXF，２５，３，−３，HXH，１９，３」の後ろに「２８」が書き込まれる。
【０１５９】
ステップＳ２０４：ブロックバイト数をブロックバイト数一時記憶領域に出力する。ブロックバイト数一時記憶領域の値は、３バイトになる。
【０１６０】
ステップＳ２０５：新ファイルのOffset（３１バイト）にブロックサイズ（３バイト）を加算する。新ファイルのOffsetは、３４バイトになる。
【０１６１】
一致ブロック発見時処理を終了する。
【０１６２】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【０１６３】
（新ファイルのOffset＝３４バイト）
ステップＳ１１２：新ファイルの３４〜３６バイト（KKK）のチェックサムは、チェックサムテーブル内にて発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【０１６４】
ステップＳ２０１：直前は不一致部分ではないので、ＮＯに分岐する。
【０１６５】
ステップＳ２０２：直前は一致ブロックであるから、ＹＥＳに分岐する。
【０１６６】
ステップＳ２２１：直前の一致ブロック(JJJ)と現在の一致ブロック(KKK)とのブロック番号は連続するから、ＹＥＳに分岐する。
【０１６７】
ステップＳ２０４：ブロックバイト数をブロックバイト数一時記憶領域に加算する。ブロックバイト数一時記憶領域の値は、６バイトになる。
【０１６８】
ステップＳ２０５：新ファイルのOffset（３４バイト）にブロックサイズ（３バイト）を加算する。新ファイルのOffsetは、３７バイトになる。
【０１６９】
一致ブロック発見時処理を終了する。
【０１７０】
図７に示すループの最後に到達したので、ループの先頭に戻る。
【０１７１】
（新ファイルのOffset＝３７バイト）
同様に、ブロックバイト数をブロックバイト数一時記憶領域に加算する。ブロックバイト数一時記憶領域の値は、９バイトになる。
【０１７２】
（新ファイルのOffset＝４０バイト）
同様に、ブロックバイト数をブロックバイト数一時記憶領域に加算する。ブロックバイト数一時記憶領域の値は、１２バイトになる。
【０１７３】
（新ファイルのOffset＝４３バイト）
同様に、ブロックバイト数をブロックバイト数一時記憶領域に加算する。ブロックバイト数一時記憶領域の値は、１５バイトになる。
【０１７４】
（新ファイルのOffset＝４６バイト）
同様に、ブロックバイト数をブロックバイト数一時記憶領域に加算する。ブロックバイト数一時記憶領域の値は、１８バイトになる。
【０１７５】
（新ファイルのOffset＝４９バイト）
同様に、ブロックバイト数をブロックバイト数一時記憶領域に加算する。ブロックバイト数一時記憶領域の値は、２１バイトになる。
【０１７６】
（新ファイルのOffset＝５２バイト）
同様に、ブロックバイト数をブロックバイト数一時記憶領域に加算する。ブロックバイト数一時記憶領域の値は、２４バイトになる。
【０１７７】
新ファイルの終端に到達したので、図７に示すループを終了する。
【０１７８】
ステップＳ３０１：新ファイルの終端は一致ブロックであるから、ＹＥＳに分岐する。
【０１７９】
ステップＳ３０２：ブロックバイト数一時記憶領域の値（２４バイト）を差分ファイルに出力する。図６（ｃ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，DXDEXEFXXF，２５，３，−３，HXH，１９，３，２８」の後ろに「２４」が書き込まれる。
【０１８０】
上記の如く、実施例１によれば、一致ブロック発見時処理中において、一致ブロックの直前は不一致部分か、一致ブロックの直前は一致ブロックかなどに応じて、Offsetを差分ファイルに出力する、ブロックバイト数を一時記憶領域に出力する、不一致部分の内容を一時記憶領域に出力する、一時記憶領域の値や内容を差分ファイルに出力するなどの処理を適切に行うことによって、差分ファイルのサイズを「より小さく」、差分ファイル作成時間を「より短く」することが可能となる。
【０１８１】
また、一致ブロックが発見された時に、直前の不一致部分の長さが閾値ｄ未満又は閾値ｄ以下である場合は、発見された一致ブロックを不一致部分とみなして、一致ブロック発見時処理へ移行しない。この閾値ｄを調節することによって、ファイルの変更の性質（例えば、一部広い範囲で非常に細かい修正がある場合などは、このパラメータを大きくすると効果が高い場合がある）に最適な差分抽出をすることができる。
【実施例２】
【０１８２】
実施例２では、不一致部分の長さに応じて、不一致部分の内容をそのまま差分ファイルに出力するか、それとも厳密差分を差分ファイルに出力するかを選択する。
【０１８３】
図９に、実施例２における一致ブロック発見時処理の流れを示す。図６、７及び９に基づいて、実施例２を説明する。
【０１８４】
（新ファイルのOffset＝１〜５バイト）
実施例１と同じであるから説明を省略する。
【０１８５】
（新ファイルのOffset＝６バイト）
ステップＳ１１２：６〜８バイト(BBB)のチェックサムがチェックサムテーブル内に発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【０１８６】
ステップＳ２０１：直前は不一致部分であるから、ＹＥＳに分岐する。
【０１８７】
ステップＳ２１１：不一致部分に関する情報であることを示す識別子（−１）と共に、不一致部分（YZ）のバイト数（２バイト）を差分ファイルに出力する。図６（ｄ）に示すように、差分ファイルの「１，３」の後ろに「−２」が書き込まれる。
【０１８８】
ステップＳ２１３：直前の不一致部分の長さと、ブロックサイズの所定倍数の値とを比較する。所定倍数は３倍とする。つまり、ブロックサイズの所定倍数の値は、９バイトとなる。不一致部分(YZ)の長さ（２バイト）は９バイト以上ではないから、ＮＯに分岐する。
【０１８９】
なお、所定倍数は３倍に限定されない。２倍、４倍などでも良い。また所定倍数は整数倍数に限定されない。１．４倍、２．５倍、３．６倍などでも良い。また、所定倍「以上」ではなく、所定倍「より大」である場合に、厳密差分をとらないとしても良い。
【０１９０】
さらに、直前の不一致部分の長さが、ブロックサイズに比べて、大きすぎる場合だけでなく、小さすぎる場合も厳密差分をとらないとしても良い。例えば、直前の不一致部分の長さがブロックサイズの１／２，１／３若しくは１／４未満又は１／２，１／３若しくは１／４以下である場合は厳密差分をとらないとしても良い。
【０１９１】
また、直前の不一致部分の長さが、ブロックサイズに比べて、大きすぎないことだけを確認したら、厳密差分をとるとしても良く、また、小さすぎないことだけを確認したら厳密差分をとるとしても良く、さらに、大きすぎないこと及び小さすぎないことの両方を確認した上で厳密差分をとるとしても良い。
【０１９２】
さらに、直前の不一致部分の長さとの比較対象は、「旧ファイルにおける対応部分の長さ」としても良い。「旧ファイルにおける対応部分」とは、「新ファイルにおける直前の一致ブロック」と「新ファイルにおける現在の一致ブロック」との間に「旧ファイルにおいて」存在するブロック、を意味する。
【０１９３】
例えば、新ファイルのOffsetが２２バイトである場合、「新ファイルにおける直前の一致ブロック」はCCCブロック、「新ファイルにおける現在の一致ブロック」はIIIブロック、これら両ブロックの間に旧ファイルにおいて存在するブロックは、DDDブロック、EEEブロック、FFFブロック、GGGブロック、HHHブロックである。よって、「旧ファイルにおける対応部分」は旧ファイルのDDDEEEFFFGGGHHH部分となる。そして、新ファイルにおける直前の不一致部分（DXDEXEFXXF部分）の長さ（１０バイト）と、旧ファイルにおける対応部分（DDDEEEFFFGGGHHH部分）の長さ（１５バイト）を比較して、「所定倍数以上」若しくは「所定倍数より大きい」又は「所定倍数以下」若しくは「所定倍数未満」であるかを判断する。
【０１９４】
ステップＳ２１５：不一致部分一時記憶領域の内容(YZ)についての厳密差分を差分ファイルに出力する。図６（ｄ）に示すように、差分ファイルの「１，３，−２」の後ろに「厳密差分データ」が書き込まれる。旧ファイルのどの部分を厳密差分の対象とするかは限定されない。例えば、直前の一致ブロックの後続のバイト列を厳密差分の対象とする。具体的には、新ファイルのOffsetが６バイトである場合、直前の一致ブロックはAAAブロックである。旧ファイルにおいてAAAブロックの後続のバイト列は、"BB"である。よって、新ファイルの"YZ"と旧ファイルの"BB"との間で厳密な差分をとる。
【０１９５】
（新ファイルのOffset＝９〜２１バイト）
実施例１と同じであるから説明を省略する。
【０１９６】
（新ファイルのOffset＝２２バイト）
ステップＳ１１２：２２〜２４バイト(III)のチェックサムがチェックサムテーブル内に発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【０１９７】
ステップＳ２０１：直前は不一致部分であるから、ＹＥＳに分岐する。
【０１９８】
ステップＳ２１１：不一致部分に関する情報であることを示す識別子（−１）と共に、不一致部分のバイト数（１２〜２１バイト目、つまり１０バイト）を差分ファイルに出力する。図６（ｄ）に示すように、差分ファイルの「１，３，−２，YZ，４，６」の後ろに「−１０」が書き込まれる。
【０１９９】
ステップＳ２１３：不一致部分の長さ（１１バイト）は、ブロックサイズを所定倍した値（９バイト）以上であるから、ＹＥＳに分岐する。
【０２００】
ステップＳ２１５：不一致部分一時記憶領域の内容（DXDEXEFXXF）を差分ファイルに出力する。図６（ｄ）に示すように、差分ファイルの「１，３，−２，（厳密差分），４，６，−１０」の後ろに「DXDEXEFXXF」が書き込まれる。
【０２０１】
（新ファイルのOffset＝２５〜２７バイト）
実施例１と同じであるから説明を省略する。
【０２０２】
（新ファイルのOffset＝２８バイト）
ステップＳ１１２：２８〜３０バイト(GGG)のチェックサムがチェックサムテーブル内に発見されるので、ＹＥＳに分岐する。
【０２０３】
ステップＳ２０１：直前は不一致部分であるから、ＹＥＳに分岐する。
【０２０４】
ステップＳ２１１：不一致部分に関する情報であることを示す識別子（−１）と共に、不一致部分（HXH）のバイト数（３バイト）を差分ファイルに出力する。図６（ｄ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，（厳密差分データ），２５，３」の後ろに「−３」が書き込まれる。
【０２０５】
ステップＳ２１３：不一致部分の長さ（３バイト）は、ブロックサイズを所定倍した値（９バイト）以上ではないから、ＮＯに分岐する。
【０２０６】
ステップＳ２１５：不一致部分一時記憶領域の内容(HXH)についての厳密差分を差分ファイルに出力する。図６（ｄ）に示すように、差分ファイルの「１，３，−２，（厳密差分），４，６，−１０，DXDEXEFXXF，２５，３，−３」の後ろに「厳密差分データ」が書き込まれる。
【０２０７】
（新ファイルのOffset＝３１〜５２バイト）
実施例１と同じであるから説明を省略する。
【０２０８】
上記の如く、実施例２によれば、閾値と不一致部分のデータ長との大小関係に応じて、厳密差分をとる／とらないを判断することとし、この閾値を新旧ファイルの特性に基づいて調整することによって、差分ファイルのサイズを「より小さく」、差分ファイル作成時間を「より短く」することが可能となる。
【０２０９】
また、新ファイルにおける不一致部分のデータ長と「旧ファイルにおける対応部分の長さ」の大小関係に基づいて、厳密差分をとる／とらないを判断することによって、差分ファイル作成時間を「より短く」することが可能となる。
【実施例３】
【０２１０】
実施例３では、直前の一致ブロックと現在の一致ブロックとの関係に応じて、不一致部分の内容をそのまま差分ファイルに出力するか、それとも厳密差分を差分ファイルに出力するかを選択する。
【０２１１】
実施例１に関して説明したように、現在の一致ブロックとは、新ファイルにおけるOffsetが先頭バイトとなっている一致ブロックを言う。直前の一致ブロックとは、現在の一致ブロックが発見される直前に発見された一致ブロックを言う。
【０２１２】
「直前の一致ブロックと現在の一致ブロックとの関係」には、「直前の一致ブロックと
現在の一致ブロックとの旧ファイルにおける連続性」と「直前の一致ブロックと現在の一致ブロックとの旧ファイルにおける前後関係」が含まれる。
【０２１３】
実施例１に関して説明したように、「直前の一致ブロックと現在の一致ブロックとの旧ファイルにおける連続性」とは、直前の一致ブロックと現在の一致ブロックとが旧ファイルにおいて連続するブロックか否かということを意味する。
【０２１４】
「直前の一致ブロックと現在の一致ブロックとの旧ファイルにおける前後関係」とは、直前の一致ブロックと現在の一致ブロックとの新ファイルおける順序と、旧ファイルにおける順序とが、逆転しているかどうかを意味する。
【０２１５】
具体的には、新ファイルにおけるOffsetが２２バイトである場合、現在の一致ブロックとは２２〜２４バイトのブロック（ＩＩＩ）のことであり、直前の一致ブロックとは９〜１１バイトのブロック（ＣＣＣ）のことであり、旧ファイルにおいても新ファイルにおいてもこれらブロックはＣＣＣブロックが前で、ＩＩＩブロックが後ろであるから、順序は逆転していない。
【０２１６】
一方、新ファイルにおけるOffsetが２８バイトである場合、現在の一致ブロックとは２８〜３０バイトのブロック（ＧＧＧ）のことであり、直前の一致ブロックとは２２〜２４バイトのブロック（ＩＩＩ）のことである。そして、旧ファイルにおいては、ＧＧＧブロックが前で、ＩＩＩブロックが後ろであるが、新ファイルにおいてはＩＩＩブロックが前で、ＧＧＧブロックが後ろであるから、順序が逆転している。
【０２１７】
（新ファイルのOffset＝１〜５バイト）
実施例１と同じであるから説明を省略する。
【０２１８】
（新ファイルのOffset＝６バイト）
ステップＳ１１２：ステップ６〜８バイト(BBB)のチェックサムがチェックサムテーブル内に発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【０２１９】
ステップＳ２０１：直前は不一致部分であるから、ＹＥＳに分岐する。
【０２２０】
ステップＳ２１１：不一致部分に関する情報であることを示す識別子（−１）と共に、不一致部分（YZ）のバイト数（２バイト）を差分ファイルに出力する。図６（ｅ）に示すように、差分ファイルの「１，３」の後ろに「−２」が書き込まれる。
【０２２１】
ステップＳ２１６：直前の一致ブロック（ＡＡＡ）と現在の一致ブロック（BBB）とは旧ファイルにおいて連続するブロックであるから、ＹＥＳに分岐する。
【０２２２】
ステップＳ２１７：不一致部分一時記憶領域の内容(YZ)を差分ファイルに出力する。図６（ｅ）に示すように、差分ファイルの「１，３，−２」の後ろに「YZ」が書き込まれる。厳密差分は取らない
（新ファイルのOffset＝９〜２１バイト）
実施例１と同じであるから説明を省略する。
【０２２３】
（新ファイルのOffset＝２２バイト）
ステップＳ１１２：２２〜２４バイト(III)のチェックサムがチェックサムテーブル内に発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【０２２４】
ステップＳ２０１：直前は不一致部分であるから、ＹＥＳに分岐する。
【０２２５】
ステップＳ２１１：不一致部分に関する情報であることを示す識別子（−１）と共に、不一致部分（DXDEXEFXXF）のバイト数（１０バイト）を差分ファイルに出力する。図６（ｅ）に示すように、差分ファイルの「１，３，−２，YZ，４，６」の後ろに「−１０」が書き込まれる。
【０２２６】
ステップＳ２１６：直前の一致ブロック（ＣＣＣ）と現在の一致ブロック（ＩＩＩ）とは旧ファイルにおいて連続するブロックではないから、ＮＯに分岐する。
【０２２７】
ステップＳ２１８：直前の一致ブロック（ＣＣＣ）と現在の一致ブロック（ＩＩＩ）とは旧ファイルにおいて前後が逆ではないから、ＮＯに分岐する。
【０２２８】
ステップＳ２１９：不一致部分一時記憶領域の内容(DXDEXEFXXF)について厳密差分を差分ファイルに出力する。
【０２２９】
（新ファイルのOffset＝２５〜２７バイト）
実施例１と同じであるから説明を省略する。
【０２３０】
（新ファイルのOffset＝２８バイト）
ステップＳ１１２：２８〜３０バイト(GGG)のチェックサムがチェックサムテーブル内に発見されるので、ＹＥＳに分岐する。一致ブロック発見時処理を開始する。
【０２３１】
ステップＳ２０１：直前は不一致部分であるから、ＹＥＳに分岐する。
【０２３２】
ステップＳ２１１：不一致部分に関する情報であることを示す識別子（−１）と共に、不一致部分（HXH）のバイト数（３バイト）を差分ファイルに出力する。図６（ｅ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，（厳密差分データ），２５，３」の後ろに「−３」が書き込まれる。
【０２３３】
ステップＳ２１６：直前の一致ブロック（III）と現在の一致ブロック（GGG）とは旧ファイルにおいて連続するブロックするブロックであるから、ＮＯに分岐する。
【０２３４】
ステップＳ１８：直前の一致ブロック（III）と現在の一致ブロック（GGG）とは旧ファイルにおいて前後が逆であるから、ＹＥＳに分岐する。
【０２３５】
ステップＳ２１７：不一致部分一時記憶領域の内容(HXH)を差分ファイルに出力する。図６（ｅ）に示すように、差分ファイルの「１，３，−２，YZ，４，６，−１０，（厳密差分データ），２５，３，−３」の後ろに「HXH」が書き込まれる。
【０２３６】
（新ファイルのOffset＝３１〜５２バイト）
実施例１と同じであるから説明を省略する。
【０２３７】
上記の如く、実施例３によれば、直前の一致ブロックと現在の一致ブロックとが旧ファイルにおいて連続するか、直前の一致ブロックと現在の一致ブロックとが旧ファイルにおいて前後が逆かに応じて、厳密差分をとる／とらないを判断することによって、差分ファイルのサイズを「より小さく」、差分ファイル作成時間を「より短く」することが可能となる。
【０２３８】
（変形例１）
前記の如く、実施例３においては、直前の一致ブロックと現在の一致ブロックとが旧ファイルにおいて前後が逆である場合には、厳密差分を取らずに、不一致部分一時記憶領域の内容をそのまま差分ファイルに出力するとした。
【０２３９】
しかし、直前の一致ブロックと現在の一致ブロックとが旧ファイルにおいて前後が逆である場合に、２つ前の一致ブロックと現在の一致ブロックとが旧ファイルにおいて前後が逆であるを検討するとしても良い。
【０２４０】
そして、２つ前の一致ブロックと現在の一致ブロックとが旧ファイルにおいて前後が逆でない場合には、２つ前の一致ブロックの後ろから現在の一致ブロックの前までを不一致部分とみなすとしても良い。つまり、２つ前の不一致部分と直前の一致ブロックと直前の一致ブロックの全体を、新たな「直前の不一致部分」とみなす。
【０２４１】
２つ前の一致ブロックを［CCC］、直前の一致ブロックを［GGG］、現在の一致ブロックを［EEE］、２つ前の不一致部分を［YYYYY］、直前の不一致部分を［ZZZZZZ］と表示して、具体的に説明する。
【０２４２】
新ファイルにおいては、
［CCC］［YYYYY］［GGG］［ZZZZZZ］［EEE］
という順番で並んでいることになる。
【０２４３】
旧ファイルにおいては、
［CCC］・・・［EEE］・・・［GGG］
という順序で並んでいるとする。
【０２４４】
つまり、旧ファイルにおいては［EEE］の後ろに存在した［GGG］が、新ファイルにおいては［EEE］の前に存在している。
【０２４５】
かかる場合において、差分ファイルには、
［EEE］の前に［ZZZZZZ］という不一致部分が存在し、
その前に［GGG］という一致ブロックが存在し、
その前に［YYYYY］という不一致部分が存在し、
その前に［CCC］という一致ブロックが存在する、
という情報を記録するのではなく、
［EEE］の前に［YYYYYGGGZZZZZZ］という不一致部分が存在し、
その前に［CCC］という一致ブロックが存在する、
という情報を記憶する。
【０２４６】
このようにすることで、新旧ファイルの特性によっては、差分ファイルのサイズを小さくすることが可能となる。
【０２４７】
（変形例２）
変形例１では、２つ前の不一致部分と、直前の一致ブロックとを、直前の不一致部分と一体として、「新たな」直前の不一致部分とした。
【０２４８】
しかし、「２つ前の」不一致部分や、「直前の」一致ブロックに限定する必要はない。現在の一致ブロックから所定距離ｄ内に「３つ前の」不一致部分や、「２つ前の」一致ブロックなどを含めて、新たな直前の不一致部分としても良い。
【０２４９】
３つ前の一致ブロックを［AAA］、３つ前の不一致部分を［XXXX］と表示して、具体的に説明する。
【０２５０】
新ファイルにおいては、
［AAA］［XXXX］［EEE］［YYYYY］［GGG］［ZZZZZZ］［CCC］
という順番で並んでいることになる。
【０２５１】
旧ファイルにおいては、
［AAA］・・・［CCC］・・・［EEE］・・・［GGG］
という順序で並んでいるとする。
【０２５２】
つまり、［GGG］は、旧ファイルにおいては［EEE］の後ろに存在したのに、新ファイルにおいては［EEE］の前に存在している。
【０２５３】
つまり、旧ファイルにおいては［CCC］の後ろに存在した［EEE］及び［GGG］が、新ファイルにおいては［CCC］の前に存在している。
【０２５４】
かかる場合において、差分ファイルには、
［CCC］の前に［ZZZZZZ］という不一致部分が存在し、
その前に［GGG］という一致ブロックが存在し、
その前に［YYYYY］という不一致部分が存在し、
その前に［EEE］という一致ブロックが存在し、
その前に［XXXX］という不一致部分が存在し、
その前に［AAA］という一致ブロックが存在する、
という情報を記録するのではなく、
［CCC］の前に［XXXXEEEYYYYYGGGZZZZZZ］という不一致部分が存在し、
その前に［AAA］という一致ブロックが存在する、
という情報を記憶する。
【０２５５】
距離dの値を適宜変更することで、新旧ファイルの特性によっては、差分ファイルのサイズをより小さくすることが可能となる。
【０２５６】
上記の如く、各実施例によれば、差分ファイは、ブロック単位のラフな差分抽出の「差分ファイル作成速度が高速」という長所と、厳密差分の「差分ファイルのサイズが小さい」という長所を兼ね備えることが可能である。
【図面の簡単な説明】
【０２５７】
【図１】実施例１〜３の差分ファイル作成装置の構成を示すブロック図である。
【図２】自己チューニング機能付き差分抽出処理の全体の流れを示すフローチャートである。
【図３】対象ファイル情報の取得と実行パラメータ自動設定の流れを示すフローチャートである。
【図４】デフォルト値テーブルの一例である。
【図５】差分抽出主処理の流れを示すフローチャートである。
【図６】（ａ）は旧ファイルの一例を、（ｂ）は新ファイルの一例を、（ｃ）〜（ｅ）は実施例１〜３において作成される差分ファイルを示す。
【図７】ハイブリッド差分抽出処理の流れを示すフローチャートである。
【図８】実施例１における一致ブロック発見時処理の流れを示すフローチャートである。
【図９】実施例２における一致ブロック発見時処理の流れを示すフローチャートである。
【図１０】実施例３における一致ブロック発見時処理の流れを示すフローチャートである。
【符号の説明】
【０２５８】
３…差分ファイル作成装置  １０…送信部、  ２０…演算処理装置（ＣＰＵ）、
３０…記憶部、  ４０…通信網、  ５０…リモートサイト
【図１】
2005173726.tif 000003
【図２】
2005173726.tif 000004
【図３】
2005173726.tif 000005
【図４】
2005173726.tif 000006
【図５】
2005173726.tif 000007
【図６】
2005173726.tif 000008
【図７】
2005173726.tif 000009
【図８】
2005173726.tif 000010
【図９】
2005173726.tif 000011
【図１０】
2005173726.tif 000012