System and method for eliminating duplicate data by generating data fingerprints using adaptive fixed-length windows

A method and system for generating data fingerprints is used to de-duplicate a data set having a high level of redundancy. A fingerprint generator generates a data fingerprint based on a data window. Each byte of the data set is added to the fingerprint generator and used to detect an anchor within the received data. If no anchor is detected, the system continues receiving bytes until a predefined window size is reached. When the window size is reached, the system records a data fingerprint based on the data window and resets the window size. If an anchor is detected, the system extends the window size such that the window ends a specified length after the location of the anchor. If the extended window is greater than a maximum size, the system ignores the anchor. The generated fingerprints are compared to a fingerprint database. The data set is then de-duplicated by replacing matching data segments with references to corresponding stored data segments.

BACKGROUND

A storage server can include one or more storage devices that enable users to store and retrieve information. A storage server can also include a storage operating system that functionally organizes the system by invoking storage operations in support of a storage service implemented by the system. They may be implemented using various storage architectures, such as network-attached storage (NAS), storage area network (SAN), or a disk assembly directly attached to a client or host computer. The storage devices are typically disk drives organized as a disk array, but can be other types of devices, such as solid-state drives or flash memory.

In many industries, such as banking, government contracting, and securities, selected data must be stored in an immutable manner for long periods of time. Typically, storage servers use data backup (e.g., to electronic tape media) to ensure that the data is protected in the event of a hardware failure. Tape backup has several disadvantages, including slow data access and often the requirement that the backup administrator manage a large number of physical tapes. As an alternative, several storage server vendors provide virtual tape library (VTL) systems that emulate tape storage devices using multiple disk drives. In a typical VTL environment, the primary storage server performs a complete backup operation of the storage server's file system (or other data store) to the VTL system. Often, the data being backed up changes very little between backups. This duplication can waste significant amounts of storage space. Some VTL systems also perform replication, in which the data being backed-up is mirrored to a remote storage server rather than stored on a local storage device. For these systems, the data duplication results in duplicated data being unnecessarily mirrored to the remote system, wasting network resources.

Existing techniques for reducing data duplication (“de-duplication”) have significant disadvantages. In general, de-duplication is performed by detecting blocks of data that are repeated within a single backup or in multiple backups stored by the data system. For any specific sequence of data, the VTL system can replace other instances of the same data with a reference to a single copy of the data. The single copy may be located within the backup or stored separately in a database. This technique may be used to reduce the size of the backup before it is stored on the disk or replicated to a separate mirror server.

A key challenge for de-duplication is detecting duplicated blocks of data. Systems cannot simply compare every possible data block, because the number of comparisons would be extremely large. To reduce the complexity to a manageable level, some backup systems use data “fingerprints” or hashes to reduce the amount of data to be compared. A data fingerprint is a value (e.g., a bit string) generated from an arbitrarily large data set using a fingerprinting algorithm. The fingerprinting algorithm can be, for example, a hashing algorithm such as SHA-1, SHA-256, or SHA-512. If two data sets are different, the fingerprinting algorithm will produce different fingerprints.

Some techniques use fixed size data blocks to generate the data fingerprints. As a data set is received, the backup system generates a data fingerprint for each fixed size block received (e.g., for each 16 KB block of data). The system then compares each data fingerprint to a database of stored fingerprints to detect duplicate blocks. An advantage of this technique is its simplicity—the system only performs one fingerprint operation for each data block. However, this method does not work well if data is added or deleted from a data block in between backups of a storage device. For example, if a single section of data is inserted in the middle of a data set that has previously been backed up, the data after the insertion in the data set will be shifted relative to the data blocks from the previous backup. Even though the data after the insertion is not changed, the duplication will not be detected because the data is divided into blocks differently in the second data set.

Some de-duplication techniques attempt to solve this problem by using variable sized data blocks or rolling hashes to generate data fingerprints. For example, some systems evaluate multiple window sizes based on a single starting point and select a window size based on a comparison function. However, these techniques tend to be computationally intensive and difficult to execute with reasonable efficiency. In particular, these techniques require that the system calculate a number of hashes and/or perform a large number of comparison operations.

SUMMARY

The present disclosure is directed to a method and system for generating data fingerprints for use in reducing data duplication in a data set. When a data set is received by the system, the system processes the data set to generate a set of data fingerprints associated with individual sections of the data set. When the system detects a data fingerprint matching a stored data fingerprint in a fingerprint database, it replaces the data corresponding to the detected data fingerprint with a reference to the stored data fingerprint. The system initially defines a data window based on an initial data window size. As data is processed, the system attempts to detect an anchor within the data window. If an anchor is detected within the data window, the system extends the data window such that the data window ends a specified length after the location of the anchor. When the system reaches the end of the data window, it generates a data fingerprint based on the contents of the window. If the data fingerprint has not been seen before, the system stores the data fingerprint and the contents of the data window in the fingerprint database. By extending the window as disclosed, the system ensures that the first data window after an anchor starts at a known position (i.e., a fixed length after the anchor), even if the data window would otherwise have had a different starting point.

An advantage of this method is that it does not add significant processing overhead compared to the fixed block size technique. In particular, if the data set does not contain an anchor, the method operates identically to the fixed size data block technique by generating data fingerprints based on the initial data window size. However, the method has the further advantage of being more robust in handling data deletions or insertions. As discussed above, when data is inserted in a data set in a fixed block size system, data after the insertion is a duplicate of data from the previous data set but is grouped into different data blocks. By extending the data window to end a fixed length after an anchor, the fingerprint system can realign the data windows so that data windows starting after the anchor are aligned with the data windows from the previous data set. The data windows after the anchor can then be de-duplicated, saving significantly more space than the fixed block size technique. The system is also more efficient than other systems that use variable block size because it does not require expensive comparison operations to determine the block size.

DETAILED DESCRIPTION

A method and system for generating data fingerprints to de-duplicate a data set is disclosed (hereinafter called “the fingerprint system” or “the system”). The system may be used in a virtual tape library (VTL) system configured to backup data sets that have a high level of redundancy. When a data set is received, the system processes the data set to generate a set of data fingerprints associated with individual sections of the data set. These data fingerprints are stored in a fingerprint database such that the data fingerprint may be used as an index to look up a data segment corresponding to the data fingerprint. When the system detects a data fingerprint matching a stored data fingerprint in the fingerprint database, it replaces the data corresponding to the detected data fingerprint with a reference to the stored data fingerprint. The de-duplicated data set may be stored in a local storage component or replicated to a mirror server using a data network.

The system generates the data fingerprints using an algorithm that can be executed either in real time (by processing each new data unit of the data set as it is received) or as a post-processing step. A fingerprint generator generates a pseudo-unique fingerprint based on the data in a data window using known hashing algorithms, such as SHA-1, SHA-256, or SHA-512. As each byte in the data set is received, the system adds the byte to the fingerprint generator. The system also attempts to detect an anchor within the received data. As used herein, an anchor is a point within a data set that may be used to define a region of interest for potential data de-duplication. An anchor has one or more characteristics that can be recognized at a later point in that data set or in another data set. If no anchor is detected in the data stream, the system continues receiving bytes until a predefined window size is reached. When the window size is reached, the system records a data fingerprint based on the data window and resets the window size, if the window size has been changed. If an anchor is detected, the system extends the window size such that the window ends a specified length after the location of the anchor. If the extended window is greater than a maximum size, the system ignores the anchor.

FIG. 1is a schematic block diagram of a storage system environment100. The storage system environment100includes a storage server125interconnected with a plurality of clients110by network120. A virtual tape library (VTL) system200is also interconnected with the network120. The VTL system200is connected to one or more storage devices, such as disks130, which are organized as a storage array160. The network120may be, for example, an Ethernet network, a Fibre Channel (FC) network, or a combination of these. For example, the clients110may be connected to the storage server125through an Ethernet network, while the VTL system200is connected to the storage server125through a FC network.

In operation, the storage server125services data access requests from the clients110. Each client110may be a general-purpose computer configured to execute applications and interact with the storage server125in accordance with a client/server model of information delivery. That is, the client may request the services of the storage server, and the system may return the results of the services requested by the client, by exchanging data packets over the network120. The clients may use file-based access protocols, such as the Common Internet File System (CIFS) protocol or Network File System (NFS) protocol, over TCP/IP when accessing information contained in data containers, such as files and directories. Alternatively, the client may use block-based access protocols, such as the Small Computer Systems Interface (SCSI) protocol encapsulated over TCP (iSCSI) and SCSI encapsulated over Fibre Channel (FCP), when accessing information.

The VTL system200appears to the storage server125as a remote tape drive; thus, the storage server125may perform a conventional tape backup operation to the VTL system200by using conventional tape backup software. Typically, the backup operation is executed by copying the entire file system stored by the storage server125to the VTL system200. As noted above, each backup copied to the VTL system200may include significant amounts of duplicated data, i.e., data that remains common among each of the backups of storage server125and/or redundant data between backups of different clients110.

FIG. 2is a schematic block diagram of a VTL system200suitable for use with the fingerprint system. The VTL system200includes one or more processors222and memory224coupled to an interconnect225. The interconnect225shown inFIG. 2is an abstraction that represents any one or more separate physical buses, point-to-point connections, or both connected by appropriate bridges, adapters, or controllers. The interconnect225, therefore, may include, for example, a system bus, a Peripheral Component Interconnect (PCI) family bus, a HyperTransport or industry standard architecture (ISA) bus, a small computer system interface (SCSI) bus, a universal serial bus (USB), IIC (I2C) bus, or an Institute of Electrical and Electronics Engineers (IEEE) standard 1394 bus, sometimes referred to as “Firewire”.

The processor(s)222include central processing units (CPUs) of the VTL system200and, thus, control the overall operation of the VTL system200. In certain embodiments, the processor(s)222accomplishes this by executing software or firmware stored in memory224. The processor(s)222may be, or may include, one or more programmable general-purpose or special-purpose microprocessors, digital signal processors (DSPs), programmable controllers, application specific integrated circuits (ASICs), programmable logic devices (PLDs), or the like, or a combination of such devices.

The memory224is or includes the main memory of the VTL system200. The memory224represents any form of random access memory (RAM), read-only memory (ROM), flash memory, or the like, or a combination of such devices. In use, the memory224stores, among other things, the operating system250of the VTL system200. The operating system250may implement a logical data object store on disks130for use by applications such as VTL module260. Alternatively, the logical data object store may be managed directly by the VTL module260. As described in greater detail below, the logical data object store includes an anchor database (DB)270and a fingerprint DB280. The memory224may also store a VTL module260containing software suitable for configuring the processor222to execute VTL functionality. Alternatively, some or all of the VTL functionality may be implemented by one or more hardware components as described above.

A storage adapter212and a network adapter226are also connected to the processor(s)222through the interconnect225. The storage adapter212allows the VTL system200to access the disks130and is, for example, a Fibre Channel adapter or a SCSI adapter. The network adapter226provides the VTL system200with the ability to communicate with remote devices, such as clients, over a network220and is, for example, an Ethernet adapter.

FIG. 3illustrates the application of fixed block size de-duplication on a group300of data sets received by the VTL system200. These data sets may be generated, for example, by successive backups of a particular file system. In particular, the group300includes data set302, which is a baseline backup of the file system. As shown in the figure, data set302is divided into fixed size blocks310,312, and314, as well as additional data blocks not shown in the figure. Data set304includes an identical set of data in data blocks316,318, and320. In a fixed block size de-duplication system, the system generates data fingerprints for each of the blocks310,312, and314. The system then stores the fingerprints and the contents of the blocks in a fingerprint database, such as the fingerprint DB280. When the data set304is received, the system generates new data fingerprints for each of the data blocks316,318, and320. When the system determines that the data fingerprints of blocks in the data set match stored data fingerprints, the system replaces the data blocks with references to locations in the fingerprint DB280. Thus, in de-duplicated data set306, each of the blocks316,318, and320have been replaced with, respectively, fingerprint IDs322,324, and326. Because each fingerprint ID322,324, and326consumes significantly less space than the corresponding data blocks316,318, and320, the resulting de-duplicated data set306is significantly smaller than the original data set304.

The group of data sets300also includes data set308, which is nearly identical to data set302but has a single insertion at point328. As shown in the figure, block330of data set308is identical to block310of data set302. However, the following block332differs from the corresponding block312in data set302because of the inserted element at point328. Successive blocks, such as block334, also differ from the corresponding blocks in data set302because the single insertion has introduced an offset from the original data set. Thus, to an algorithm using fixed size blocks, data set308is almost entirely different from data set302and its size can only be reduced by a small amount. A similar problem occurs when data is deleted from the data set. However, an adaptive algorithm could regain most of the reduction that was possible with data set304.

FIG. 4is a logical block diagram of a fingerprint system400according to the techniques introduced here. The system400may be implemented using hardware such as the VTL system200depicted inFIG. 2. The system400provides functionality to generate data fingerprints based on a received data set and to de-duplicate the data set based on the generated fingerprints. Aspects of the system may be implemented as special purpose hardware circuitry, programmable circuitry, or a combination of these. As will be discussed in additional detail herein, the system400includes a number of modules to facilitate the functions of the system. Although the various modules are described as residing in a single server, the modules are not necessarily physically co-located. In some embodiments, the various modules could be distributed over multiple physical devices and the functionality implemented by the modules may be provided by calls to remote services. Similarly, the data structures could be stored in local storage or remote storage, and distributed in one or more physical devices. Assuming a programmable implementation, the code to support the functionality of this system may be stored on a computer-readable medium such as an optical drive, flash memory, random access memory (RAM), read-only memory (ROM), or a hard drive. One skilled in the art will appreciate that at least some of these individual components and subcomponents may be implemented using, for example, application specific integrated circuits (ASICs), programmable logic devices (PLDs), or a general-purpose processor configured with software and/or firmware.

As shown inFIG. 4, the system400includes a data connection to the network120. As discussed above, the system receives backup data sets from the storage server125through the network120. The system then generates data fingerprints and de-duplicates the stream for storage in the VTL system200(or for replication to a separate system on the network). The system400also includes a storage component402, which may be the disks130shown inFIGS. 1 and 2. The storage component402stores the anchor DB270and the fingerprint DB280shown inFIG. 2. The storage component402may also be used to store the de-duplicated data sets generated by the system400.

The system400also includes a processing component404, which is responsible for analyzing backup data sets and performing the de-duplication algorithms. The processing component404includes various modules to assist in execution. It should be noted, however, that the processing component404is a logical grouping of functionality. As discussed above, the individual modules may be implemented using separate hardware components and are not necessarily physically collocated.

The processing component404includes a fingerprint generator406, which is configured to generate a data fingerprint based on a specified portion of the data set. The fingerprint generator generates the data fingerprints using any hashing algorithms known in the art, such as SHA-1, SHA-256, or SHA-512. The fingerprint generator406operates on an arbitrary data window in the received data set and is not limited to a particular size of data for its execution. The data window is a section of the data set that is used for generating the data fingerprint and is defined by a beginning point and an end point within the data set. The data within the data window is referred to as a data segment.

The processing component404includes a data window control component408, which is configured to control the size of a data window used by the fingerprint generator406for generating a data fingerprint. The execution of the data window control component408is discussed in greater detail below with reference toFIG. 5A. The processing component404also includes an anchor detector component410, which is configured to process the data set to detect one or more anchors. As stated above, an anchor is part of the data set that may be used to define a region of interest for potential data de-duplication. An anchor can be recognized at later points in the data set and used for re-alignment. Anchors may be detected by, for example, performing a rolling hash on the data set and locating anchors at points where the hash has a selected value. Anchors may also be selected based on location within data containers, e.g., a file, or other contextual information, e.g., at predefined offsets within the data set.

The data window control component408and the anchor detector component410interact to define the data window used by the fingerprint generator406. The anchor detector component410allows the system to adapt to insertions or deletions in the data set by detecting locations in the data set that were also present in previously received data sets. As discussed above, a problem with using a fixed block size for de-duplication is that the algorithm does not work well in the presence of even a single insertion or deletion. The anchor detector component410allows the system to resynchronize with previously processed data sets based on the set of known points (i.e., the anchors) in the newly received data set. Thus, for the group300of data sets inFIG. 3, the system could realign the data blocks in data set308to be consistent with the data blocks in data set302by detecting an anchor at some point after the insertion at point328.

The processing component also includes a fingerprint storage component412, which is configured to store new data fingerprints generated by the fingerprint generator406in the fingerprint DB280. After the fingerprint generator406generates a new data fingerprint, the fingerprint storage component412compares the new data fingerprint to the data fingerprints stored in the fingerprint DB280. If the new data fingerprint is not already included in the fingerprint DB280, the fingerprint storage component412stores the new data fingerprint in the database together with a data segment containing the contents of the data window used to generate the data fingerprint. In some embodiments, the fingerprint storage component412stores the data segment itself in the fingerprint DB280. In other embodiments, the fingerprint storage component412stores a reference to the data segment, while the data segment is stored in a separate location by the data storage component402. The fingerprint storage component412may also store other metadata in the fingerprint DB280, such as the length of the data window or the data window's position within the data set.

The processing component404also includes a data set de-duplication component414, which uses the data fingerprints generated by the fingerprint generator406and the fingerprint DB280to de-duplicate the received data sets. The data set de-duplication component414compares a new data fingerprint to the data fingerprints stored in the fingerprint DB280to determine if the new fingerprint has previously been detected. If the new fingerprint has previously been detected, the data set de-duplication component414de-duplicates the data set by replacing the corresponding data segment with a reference to a location in the fingerprint database. In some implementations, the system may confirm the match before replacing the data segment by executing a bitwise compare of the current data segment and the stored data segment.

The data set de-duplication component414includes two submodules used to execute specific types of de-duplication based on the data fingerprints. The first submodule is the data set storage submodule416, which uses the newly generated fingerprint to de-duplicate the data set for storage in the storage component402. The data set storage submodule416replaces a portion of the data set with a reference to the data segment corresponding to the fingerprint and stores the de-duplicated data set in the storage component402.

The data set de-duplication component414also includes a data set replication submodule418, which de-duplicates the data set before it is transmitted over the network120to a second storage server (the “mirror server”). As with the data set storage submodule416, the data set replication submodule418replaces each data window with a reference to a stored fingerprint in the fingerprint DB280. The data set replication submodule418then transmits the references to the mirror server for replication. One skilled in the art will appreciate that these two operations (de-duplication and replication) are roughly equivalent and differ primarily in the location where the data is stored.

FIG. 5Ais a flowchart of a process500for generating a data fingerprint according to the disclosed system. The process500operates to adaptively determine a data window size based on characteristics of the data set. The process500begins with an initial data window size that is selected based on available memory or other parameters. The initial data window size may be, for example, 16 KB or 32 KB. As discussed below, the process500is executed as a continuous loop that processes one data unit at a time until the data set has been completely processed. Thus, the process500can be executed in real time or near-real time as the data set is received. The process can also be executed as a post-processing step, in which the complete data set is stored locally and then processed according to the algorithm. In either case, the process functions by receiving each new data unit in the order that the data unit is stored in the data set. In one embodiment (discussed herein), the process500operates on individual bytes of the data set. However, the process500may also operate on different sized data units, such as two-byte or four-byte words.

Processing begins at block502, where the system receives the next byte from the data set (or the first byte, if the system is at the beginning of the data set). The system then proceeds to block504, where it adds the newly received byte to the fingerprint generator406. In one embodiment, the system adds the byte to a data buffer that stores the data to be used for generating the new data fingerprint. Alternatively, the fingerprint generator406may execute continuously, so that it generates a new fingerprint as each byte is added to the fingerprint generator. In this implementation, the system stores the generated fingerprint only at selected times. In either case, the data fingerprint is stored at times determined based on the data window size, as discussed below.

After adding the byte to the fingerprint generator406, the system proceeds to block506, where it attempts to detect an anchor based on the received data. The system provides the byte to the anchor detector component410, which determines whether an anchor has been detected based on the data received up to that point. The window for detecting an anchor is not necessarily the same as the data window for generating the data fingerprint and is generally a fixed size. As discussed above, the system may detect an anchor by executing a rolling hash on the bytes of the data set using standard hashing techniques. After providing the byte to the anchor detector component410, the system proceeds to decision block508, where it determines whether an anchor was detected.

If an anchor was not detected in the data set, the process500effectively operates as a fixed block size algorithm. If an anchor was not detected in block508, the system proceeds to decision block510, where it determines if the data window size has been reached (i.e., if the fingerprint generator has received a number of bytes equal to the data window size). If the system has not detected an anchor in the data set, the data window size is determined based on the initial data window size set by the system. If the data window size has not been reached, the system proceeds to decision block520to continue processing the data set. If the data window size has been reached, the system proceeds to block512, where it records the data fingerprint determined by the current data window, resets the data window size to the initial data window size, and clears the data from the fingerprint generator406.

If an anchor was detected in block508, the system proceeds to a second branch of the process500, in which the system extends the data window. In this branch, the system extends the data window so that it ends a fixed length after the location of the detected anchor, while keeping the same starting point for the window. In effect, the anchor provides a resynchronization point, so that a new data window will always begin a fixed distance after the location of an anchor. As with the initial data window size, the extension amount may be any arbitrary value, such as 16 KB or 32 KB.

The system also defines a maximum data window size parameter that limits the growth of the data window. This is useful to avoid consuming too much memory in the fingerprint generator406by having the data window grow without limit. In some embodiments, the maximum size is twice the initial size. Thus, in decision block514, the system determines whether the data window would be greater than the maximum size if it were extended. If the extended window would be greater than the maximum size, the system proceeds to block516, where it ignores the anchor and proceeds to the first branch of the method500as if the anchor had never been detected. The system then repeats steps510and512to determine whether the data window size has been reached and record the data fingerprint. If the extended window would not be greater than the maximum size, the system proceeds to block518, where it extends the window such that the data window ends the fixed length after the location of the anchor. At this point, there is no need to test if the window size has been reached, so processing for the extension branch of the process500ends.

After the processing branches have been executed, processing proceeds to decision block520, where the system determines if additional data is available in the data set. If additional data is available, the system returns to block502, where it receives the next byte and repeats the steps discussed above. If no more data is available in the data set, the system proceeds to block522, where it records a data fingerprint based on the remaining data in the fingerprint generator406. The process then exits.

FIG. 5Bis an example of the execution of the method500on a sample data set550. As shown in the figure, the sample data set includes anchors at locations552,554, and556. At the beginning of the data set, the system does not detect an anchor within the initial data window. Based on this, the system generates a data fingerprint based on Window 1, which is defined by the initial data window without any extension.

For the second window, the system detects an anchor552within the data window defined by the initial window size. The system then extends the data window by the extension amount (Ext 1), such that the data window has the larger size shown as Window 2. As shown inFIG. 5B, there are no additional anchors within the extended window. Therefore, the system generates a data fingerprint based on window 2.

The process executes similarly with the next portion of the data set. However, in this case the anchor points554and556are closer together. Specifically, anchor point554is within the initial data window. Therefore, the system first extends the window by the extension amount (shown as Ext 2). As processing continues using the extended window, the system detects the anchor point556. In response, the system again extends the data window by the extension amount (Ext 3). As no more anchors exist within the remainder of the extended data window, the system generates a data fingerprint based on the extended data window (Window 3). Although not shown in the figure, if the repeated extensions of the window had exceeded the maximum data window size, the system would have ignored the last detected anchor.

As discussed above, after each data fingerprint is generated (or, alternatively, after all fingerprints have been generated), the system stores any newly detected data fingerprints in the fingerprint DB280. After generating each data fingerprint, the system may also perform the de-duplication methods discussed above. In particular, the system may look up the data fingerprint in the fingerprint DB280and replace the data segment corresponding to the data fingerprint with a reference to a stored data fingerprint in the fingerprint DB280. The modified data set may then be stored in the storage component402or replicated to a mirror server as discussed above.

FIG. 5Cillustrates an example application of the fingerprint system to a group of data sets received by the VTL system. In the example, the initial data window size and the extension amount are both equal to two data units. The data sets562and564are successive backups of a storage server that are identical except for a single insertion in data set564at point578. In addition, both data sets include an anchor at point566.

When data sets562and564are processed according to the method560described inFIG. 5A, data windows that do not include an anchor will have a length of the initial data window size (i.e., two data units). Thus, as processing begins for data set562, the system uses the initial data window size to define data windows568and570, because neither data window contains an anchor. The system then defines initial data window572based on the initial data window size with a starting point at the end of data window570. When the system reaches point566, it extends data window572in response to detecting the anchor. This defines data window574, which is extended to a length of three data units (i.e., ending two data units after the anchor location at point566). The final window576does not contain an anchor, so the system uses the initial data window size. As each data window is determined, the system generates a data fingerprint based on the contents of the data window and stores the information in the fingerprint DB280.

The system processes data set564in a similar fashion. As with data set562, the system uses the initial data window size to define data windows578and580because neither data window includes an anchor. Because the contents of data window578are identical to data window568, the system can replace the contents of the data window with a reference to the fingerprint DB280, as discussed above. However, the contents of data window580have not been seen before, so the system stores the fingerprint information in the fingerprint DB280. The system then defines initial data window584using the initial data window size. Because of the insertion at point578, the anchor at point566is detected at the end of initial data window584. Based on the detection, the system defines extended window586by extending data window584to end two data units after the anchor. The system then stores the fingerprint and contents of extended window586in the fingerprint DB280. The system then defines the data window588, again using the initial data window size. Because the data window588does not include an anchor, the system generates a fingerprint based on the contents of the window without extending it. The contents of data window588are identical to the contents of data window576, so data window588can then be replaced with a reference to the fingerprint DB280. Thus, unlike the fixed block size example inFIG. 3, the fingerprint system is able to use the anchor at point566to realign the blocks in the data sets562and564. Despite the insertion at point578, the system was able to determine that data window586was identical to data window574. In addition, any data after these blocks will continue to correspond until the next insertion or deletion in data set564.