### Is there an existing issue for this?

- [X] I have searched the existing issues

### Current Behavior

I am using the latest tag for the CI/CD process and today it started to fail because unit tests for the S3 provider that cover multipart upload throw the "Expected hash not equal to calculated hash" error on uploading a part. It worked just fine with the old version. The same unit tests work correctly with the real S3 provider as well.

And there is another issue. You fixed the https://github.com/localstack/localstack/issues/8392 bug that I reported previously but there is no version on Docker Hub that has that fix but does not have the new bug I described above. It seems that you rewrite the latest tag in Docker Hub which makes it impossible to rollback to the previous version.

### Expected Behavior

1. The upload part works without throwing an exception.
2. The previous versions of Docker images are available on Docker Hub.

### How are you starting LocalStack?

With a docker-compose file

### Steps To Reproduce

1. Initiate multipart upload with the correct MD5 hash.
2. Upload a part for which the hash was calculated.

### Environment

```markdown
- OS: Windows 11
- LocalStack: latest
```


### Anything else?

_No response_
for part in self.parts.values():
            part.dispose()
        full_etag = hashlib.md5(usedforsecurity=False)
        full_etag.update(bytes(md5s))
        total.seek(0)
        return total, f"{full_etag.hexdigest()}-{count}"
    def set_part(
        self, part_id: int, value: IO[bytes], decoded_content_length: int = None
    ) -> StreamedFakeKey:
        if part_id < 1:
            raise s3_exceptions.NoSuchUpload(upload_id=part_id)
        
        
        key_value = value if decoded_content_length is None else BytesIO()
        key = StreamedFakeKey(
            part_id, key_value, encryption=self.sse_encryption, kms_key_id=self.kms_key_id
        )
        
        if decoded_content_length:
            key.set_value_from_chunked_payload(value, decoded_content_length)
        if part_id in self.parts:
            
            self.parts[part_id].dispose()
        self.parts[part_id] = key
        if part_id not in self.partlist:
            bisect.insort(self.partlist, part_id)
        return key
def apply_stream_patches():
    @patch(s3_models.S3Backend.create_multipart_upload, pass_target=False)
    def create_multipart_upload(