A method for deduplication in a storage system, wherein the storage system comprises a controller and a storage device, and the method comprises: receiving , by the controller, a first write request, wherein the first write request carries a first logical block address and first to-be-written data; obtaining , by the controller, a first fingerprint of the first to-be-written data; inserting , by the controller, the first fingerprint into a fingerprint table when the fingerprint table does not comprise the first fingerprint, and allocating a first storage address from the storage device to the first to-be-written data, wherein there is no storage address corresponding to the first fingerprint in the fingerprint table; storing , by the controller, the first to-be-written data at the first storage address; establishing , by the controller, a mapping relationship between the first logical block address and the first storage address; receiving , by the controller, a second write request, wherein the second write request carries a second logical block address and second to-be-written data; obtaining , by the controller, a fingerprint of the second to-be-written data, wherein the fingerprint of the second to-be-written data is the first fingerprint; allocating , by the controller, a second storage address from the storage device to the second to-be-written data when the controller queries the fingerprint table according to the first fingerprint of the second to-be-written data and determines that no storage address corresponding to the first fingerprint exists; storing, by the controller, the second to-be-written data at the second storage address; establishing, by the controller, a mapping relationship between the first fingerprint and the second storage address in the fingerprint table; and establishing, by the controller, a mapping relationship between the second logical block address and the second storage address. receiving , by the controller, a first write request, wherein the first write request carries a first logical block address and first to-be-written data; obtaining , by the controller, a first fingerprint of the first to-be-written data; inserting , by the controller, the first fingerprint into a fingerprint table when the fingerprint table does not comprise the first fingerprint, and allocating a first storage address from the storage device to the first to-be-written data, wherein there is no storage address corresponding to the first fingerprint in the fingerprint table; storing , by the controller, the first to-be-written data at the first storage address; establishing , by the controller, a mapping relationship between the first logical block address and the first storage address; receiving , by the controller, a second write request, wherein the second write request carries a second logical block address and second to-be-written data; obtaining , by the controller, a fingerprint of the second to-be-written data, wherein the fingerprint of the second to-be-written data is the first fingerprint; allocating , by the controller, a second storage address from the storage device to the second to-be-written data when the controller queries the fingerprint table according to the first fingerprint of the second to-be-written data and determines that no storage address corresponding to the first fingerprint exists; storing, by the controller, the second to-be-written data at the second storage address; establishing, by the controller, a mapping relationship between the first fingerprint and the second storage address in the fingerprint table; and establishing, by the controller, a mapping relationship between the second logical block address and the second storage address. <EOS>