public async Task<BlobFingerprint> GetFingerprintAsync(Stream stream, CancellationToken cancellationToken) { using (var sha3 = new Keccak()) using (var sha256 = SHA256.Create()) using (var md5 = MD5.Create()) { var buffers = new[] { AllocateBuffer(), AllocateBuffer() }; var index = 0; var totalLength = 0L; var readTask = stream.ReadAsync(buffers[index], 0, buffers[index].Length, cancellationToken); for (;;) { var length = await readTask.ConfigureAwait(false); if (length < 1) break; var buffer = buffers[index]; if (++index >= buffers.Length) index = 0; readTask = stream.ReadAsync(buffers[index], 0, buffers[index].Length, cancellationToken); totalLength += length; sha3.TransformBlock(buffer, 0, length, null, 0); sha256.TransformBlock(buffer, 0, length, null, 0); md5.TransformBlock(buffer, 0, length, null, 0); } sha3.TransformFinalBlock(buffers[0], 0, 0); sha256.TransformFinalBlock(buffers[0], 0, 0); md5.TransformFinalBlock(buffers[0], 0, 0); foreach (var buffer in buffers) FreeBuffer(buffer); var fingerprint = new BlobFingerprint(totalLength, sha3.Hash, sha256.Hash, md5.Hash); return fingerprint; } }
public FileFingerprint(string fullFilePath, DateTime lastModifiedUtc, BlobFingerprint fingerprint, bool wasCached = false) { Fingerprint = fingerprint; WasCached = wasCached; FullFilePath = fullFilePath; LastModifiedUtc = lastModifiedUtc; }
public async Task <BlobFingerprint> GetFingerprintAsync(Stream stream, CancellationToken cancellationToken) { using (var sha3 = new Keccak()) using (var sha256 = SHA256.Create()) using (var md5 = MD5.Create()) { var buffers = new[] { AllocateBuffer(), AllocateBuffer() }; var index = 0; var totalLength = 0L; var readTask = stream.ReadAsync(buffers[index], 0, buffers[index].Length, cancellationToken); for (; ;) { var length = await readTask.ConfigureAwait(false); if (length < 1) { break; } var buffer = buffers[index]; if (++index >= buffers.Length) { index = 0; } readTask = stream.ReadAsync(buffers[index], 0, buffers[index].Length, cancellationToken); totalLength += length; sha3.TransformBlock(buffer, 0, length, buffer, 0); sha256.TransformBlock(buffer, 0, length, buffer, 0); md5.TransformBlock(buffer, 0, length, buffer, 0); } sha3.TransformFinalBlock(buffers[0], 0, 0); sha256.TransformFinalBlock(buffers[0], 0, 0); md5.TransformFinalBlock(buffers[0], 0, 0); foreach (var buffer in buffers) { FreeBuffer(buffer); } var fingerprint = new BlobFingerprint(totalLength, sha3.Hash, sha256.Hash, md5.Hash); return(fingerprint); } }
static async Task <FileFingerprint> ReadFileFingerprintAsync(JsonReader reader, CancellationToken cancellationToken) { if (JsonToken.StartObject != reader.TokenType) { throw new JsonReaderException("State not object"); } string path = null; DateTime?modified = null; long? size = null; byte[] md5 = null; byte[] sha256 = null; byte[] sha3_512 = null; while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false)) { if (reader.TokenType == JsonToken.EndObject) { if (null == path || !modified.HasValue || !size.HasValue || null == md5 || null == sha256 || null == sha3_512) { throw new JsonReaderException("Missing required property"); } var fingerprint = new BlobFingerprint(size.Value, sha3_512, sha256, md5); return(new FileFingerprint(path, modified.Value, fingerprint, true)); } if (reader.TokenType != JsonToken.PropertyName) { throw new JsonReaderException("Missing property name"); } var name = (string)reader.Value; if (!await reader.ReadAsync(cancellationToken).ConfigureAwait(false)) { throw new JsonReaderException("Missing property value for " + name); } switch (name) { case "path": path = (string)reader.Value; break; case "modified": modified = DateTime.FromBinary((long)reader.Value); break; case "size": size = (long)reader.Value; break; case "sha256": sha256 = (byte[])reader.Value; break; case "md5": md5 = (byte[])reader.Value; break; case "sha3_512": sha3_512 = (byte[])reader.Value; break; default: Debug.WriteLine("Unknown name: " + name); break; } } return(null); }
IFileFingerprint ReadFileFingerprint(JsonReader reader) { if (JsonToken.StartObject != reader.TokenType) throw new JsonReaderException("State not object"); string path = null; DateTime? modified = null; long? size = null; byte[] md5 = null; byte[] sha256 = null; byte[] sha3_512 = null; while (reader.Read()) { if (reader.TokenType == JsonToken.EndObject) { if (null == path || !modified.HasValue || !size.HasValue || null == md5 || null == sha256 || null == sha3_512) throw new JsonReaderException("Missing required property"); var fingerprint = new BlobFingerprint(size.Value, sha3_512, sha256, md5); return new FileFingerprint(path, modified.Value, fingerprint, true); } if (reader.TokenType != JsonToken.PropertyName) throw new JsonReaderException("Missing property name"); var name = (string)reader.Value; if (!reader.Read()) throw new JsonReaderException("Missing property value for " + name); switch (name) { case "path": path = (string)reader.Value; break; case "modified": modified = DateTime.FromBinary((long)reader.Value); break; case "size": size = (long)reader.Value; break; case "sha256": sha256 = (byte[])reader.Value; break; case "md5": md5 = (byte[])reader.Value; break; case "sha3_512": sha3_512 = (byte[])reader.Value; break; } } return null; }