Пример #1
0
            public virtual void CalcHashes(Hashes hashFlags, Validations validationFlags)
            {
                if (IssueModel.Data.HasFatal)
                {
                    return;
                }

                bool hitCache = Data.fBuf != null && Data.FileSize < Int32.MaxValue;

                if ((hashFlags & Hashes.FileMD5) != 0 && Data.fileMD5 == null)
                {
                    var hasher = new Md5Hasher();
                    if (hitCache)
                    {
                        hasher.Append(Data.fBuf, 0, Data.fBuf.Length);
                    }
                    else
                    {
                        hasher.Append(Data.fbs);
                    }
                    Data.fileMD5 = hasher.GetHashAndReset();
                }

                if ((hashFlags & Hashes.FileSHA1) != 0 && Data.fileSHA1 == null)
                {
                    var hasher = new Sha1Hasher();
                    if (hitCache)
                    {
                        hasher.Append(Data.fBuf, 0, Data.fBuf.Length);
                    }
                    else
                    {
                        hasher.Append(Data.fbs);
                    }
                    Data.fileSHA1 = hasher.GetHashAndReset();
                }

                if ((hashFlags & Hashes.FileSHA256) != 0 && Data.fileSHA256 == null)
                {
                    var hasher = new Sha256Hasher();
                    if (hitCache)
                    {
                        hasher.Append(Data.fBuf, 0, Data.fBuf.Length);
                    }
                    else
                    {
                        hasher.Append(Data.fbs);
                    }
                    Data.fileSHA256 = hasher.GetHashAndReset();
                }

                if ((hashFlags & Hashes.MediaSHA1) != 0 && Data.mediaSHA1 == null)
                {
                    if (Data.MediaCount == Data.FileSize && Data.fileSHA1 != null)
                    {
                        System.Diagnostics.Debug.Assert(Data.mediaPosition == 0);
                        Data.mediaSHA1 = Data.fileSHA1;
                    }
                    else
                    {
                        var hasher = new Sha1Hasher();
                        if (hitCache)
                        {
                            hasher.Append(Data.fBuf, (int)Data.mediaPosition, (int)Data.MediaCount);
                        }
                        else
                        {
                            hasher.Append(Data.fbs, Data.mediaPosition, Data.MediaCount);
                        }
                        Data.mediaSHA1 = hasher.GetHashAndReset();
                    }
                }

                if ((hashFlags & Hashes.MetaSHA1) != 0 && Data.metaSHA1 == null)
                {
                    var hasher    = new Sha1Hasher();
                    var suffixPos = Data.mediaPosition + Data.MediaCount;

                    if (hitCache)
                    {
                        hasher.Append(Data.fBuf, 0, (int)Data.mediaPosition, (int)suffixPos, (int)(Data.FileSize - suffixPos));
                    }
                    else
                    {
                        hasher.Append(Data.fbs, 0, Data.mediaPosition, suffixPos, Data.FileSize - suffixPos);
                    }

                    Data.metaSHA1 = hasher.GetHashAndReset();
                }
            }