1. A method for detecting a duplicate data object at a storage server, the method comprising: receiving an input data object at the storage server, wherein the input data object references a plurality of data blocks; storing, at the storage server, the received input data object; generating, by the storage server, an object-level fingerprint for the input data object, wherein the object-level fingerprint is a single fingerprint representative of all of the data blocks referenced by the data object, wherein generating the object-level fingerprint comprises generating a hierarchical tree of fingerprints for the input data object, said hierarchical tree having a base layer and one or more upper layers above the base layer, the base layer having one fingerprint for each data block referenced by the input data object, each of the one or more upper layers having at least one fingerprint representative of a plurality of fingerprints from an immediately lower layer of the hierarchical tree, wherein a top layer of the hierarchical tree is the object-level fingerprint of the input data object, wherein each layer of the hierarchical tree is stored in a separate storage container; and detecting, at the storage server, whether the input data object is a duplicate data object by comparing the object-level fingerprint of the input data object against each of a plurality of preexisting object-level fingerprints maintained by the storage server, each preexisting object-level fingerprint corresponding to a unique data object maintained by the storage server.