11 people like it.
Like the snippet!
Async hashing
Async memory or file hashing
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
|
open System
open System.IO
open System.Security.Cryptography
// synchronous file hashing
let hashFile f =
use fs = new FileStream(f, FileMode.Open)
use hashFunction = new SHA512Managed()
hashFunction.ComputeHash fs |> Convert.ToBase64String
// async stream hashing
let hashAsync bufferSize (hashFunction: HashAlgorithm) (stream: Stream) =
let rec hashBlock currentBlock count = async {
let buffer = Array.zeroCreate<byte> bufferSize
let! readCount = stream.AsyncRead buffer
if readCount = 0 then
hashFunction.TransformFinalBlock(currentBlock, 0, count) |> ignore
else
hashFunction.TransformBlock(currentBlock, 0, count, currentBlock, 0) |> ignore
return! hashBlock buffer readCount
}
async {
let buffer = Array.zeroCreate<byte> bufferSize
let! readCount = stream.AsyncRead buffer
do! hashBlock buffer readCount
return hashFunction.Hash |> Convert.ToBase64String
}
// async file hashing
let hashFileAsync f =
let bufferSize = 32768
async {
use fs = File.OpenRead f
use hashFunction = new SHA512Managed()
return! hashAsync bufferSize hashFunction fs
}
|
namespace System
namespace System.IO
namespace System.Security
namespace System.Security.Cryptography
val hashFile : f:string -> string
Full name: Script.hashFile
val f : string
val fs : FileStream
Multiple items
type FileStream =
inherit Stream
new : path:string * mode:FileMode -> FileStream + 14 overloads
member BeginRead : array:byte[] * offset:int * numBytes:int * userCallback:AsyncCallback * stateObject:obj -> IAsyncResult
member BeginWrite : array:byte[] * offset:int * numBytes:int * userCallback:AsyncCallback * stateObject:obj -> IAsyncResult
member CanRead : bool
member CanSeek : bool
member CanWrite : bool
member EndRead : asyncResult:IAsyncResult -> int
member EndWrite : asyncResult:IAsyncResult -> unit
member Flush : unit -> unit + 1 overload
member GetAccessControl : unit -> FileSecurity
...
Full name: System.IO.FileStream
--------------------
FileStream(path: string, mode: FileMode) : unit
(+0 other overloads)
FileStream(handle: Win32.SafeHandles.SafeFileHandle, access: FileAccess) : unit
(+0 other overloads)
FileStream(path: string, mode: FileMode, access: FileAccess) : unit
(+0 other overloads)
FileStream(handle: Win32.SafeHandles.SafeFileHandle, access: FileAccess, bufferSize: int) : unit
(+0 other overloads)
FileStream(path: string, mode: FileMode, access: FileAccess, share: FileShare) : unit
(+0 other overloads)
FileStream(handle: Win32.SafeHandles.SafeFileHandle, access: FileAccess, bufferSize: int, isAsync: bool) : unit
(+0 other overloads)
FileStream(path: string, mode: FileMode, access: FileAccess, share: FileShare, bufferSize: int) : unit
(+0 other overloads)
FileStream(path: string, mode: FileMode, access: FileAccess, share: FileShare, bufferSize: int, options: FileOptions) : unit
(+0 other overloads)
FileStream(path: string, mode: FileMode, access: FileAccess, share: FileShare, bufferSize: int, useAsync: bool) : unit
(+0 other overloads)
FileStream(path: string, mode: FileMode, rights: Security.AccessControl.FileSystemRights, share: FileShare, bufferSize: int, options: FileOptions) : unit
(+0 other overloads)
type FileMode =
| CreateNew = 1
| Create = 2
| Open = 3
| OpenOrCreate = 4
| Truncate = 5
| Append = 6
Full name: System.IO.FileMode
field FileMode.Open = 3
val hashFunction : SHA512Managed
Multiple items
type SHA512Managed =
inherit SHA512
new : unit -> SHA512Managed
member Initialize : unit -> unit
Full name: System.Security.Cryptography.SHA512Managed
--------------------
SHA512Managed() : unit
HashAlgorithm.ComputeHash(buffer: byte []) : byte []
HashAlgorithm.ComputeHash(inputStream: Stream) : byte []
HashAlgorithm.ComputeHash(buffer: byte [], offset: int, count: int) : byte []
type Convert =
static val DBNull : obj
static member ChangeType : value:obj * typeCode:TypeCode -> obj + 3 overloads
static member FromBase64CharArray : inArray:char[] * offset:int * length:int -> byte[]
static member FromBase64String : s:string -> byte[]
static member GetTypeCode : value:obj -> TypeCode
static member IsDBNull : value:obj -> bool
static member ToBase64CharArray : inArray:byte[] * offsetIn:int * length:int * outArray:char[] * offsetOut:int -> int + 1 overload
static member ToBase64String : inArray:byte[] -> string + 3 overloads
static member ToBoolean : value:obj -> bool + 17 overloads
static member ToByte : value:obj -> byte + 18 overloads
...
Full name: System.Convert
Convert.ToBase64String(inArray: byte []) : string
Convert.ToBase64String(inArray: byte [], options: Base64FormattingOptions) : string
Convert.ToBase64String(inArray: byte [], offset: int, length: int) : string
Convert.ToBase64String(inArray: byte [], offset: int, length: int, options: Base64FormattingOptions) : string
val hashAsync : bufferSize:int -> hashFunction:HashAlgorithm -> stream:Stream -> Async<string>
Full name: Script.hashAsync
val bufferSize : int
val hashFunction : HashAlgorithm
type HashAlgorithm =
member CanReuseTransform : bool
member CanTransformMultipleBlocks : bool
member Clear : unit -> unit
member ComputeHash : inputStream:Stream -> byte[] + 2 overloads
member Dispose : unit -> unit
member Hash : byte[]
member HashSize : int
member Initialize : unit -> unit
member InputBlockSize : int
member OutputBlockSize : int
...
Full name: System.Security.Cryptography.HashAlgorithm
val stream : Stream
type Stream =
inherit MarshalByRefObject
member BeginRead : buffer:byte[] * offset:int * count:int * callback:AsyncCallback * state:obj -> IAsyncResult
member BeginWrite : buffer:byte[] * offset:int * count:int * callback:AsyncCallback * state:obj -> IAsyncResult
member CanRead : bool
member CanSeek : bool
member CanTimeout : bool
member CanWrite : bool
member Close : unit -> unit
member CopyTo : destination:Stream -> unit + 1 overload
member Dispose : unit -> unit
member EndRead : asyncResult:IAsyncResult -> int
...
Full name: System.IO.Stream
val hashBlock : (byte [] -> int -> Async<unit>)
val currentBlock : byte []
val count : int
val async : AsyncBuilder
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.async
val buffer : byte []
type Array =
member Clone : unit -> obj
member CopyTo : array:Array * index:int -> unit + 1 overload
member GetEnumerator : unit -> IEnumerator
member GetLength : dimension:int -> int
member GetLongLength : dimension:int -> int64
member GetLowerBound : dimension:int -> int
member GetUpperBound : dimension:int -> int
member GetValue : [<ParamArray>] indices:int[] -> obj + 7 overloads
member Initialize : unit -> unit
member IsFixedSize : bool
...
Full name: System.Array
val zeroCreate : count:int -> 'T []
Full name: Microsoft.FSharp.Collections.Array.zeroCreate
Multiple items
val byte : value:'T -> byte (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.byte
--------------------
type byte = Byte
Full name: Microsoft.FSharp.Core.byte
val readCount : int
member Stream.AsyncRead : count:int -> Async<byte []>
member Stream.AsyncRead : buffer:byte [] * ?offset:int * ?count:int -> Async<int>
HashAlgorithm.TransformFinalBlock(inputBuffer: byte [], inputOffset: int, inputCount: int) : byte []
val ignore : value:'T -> unit
Full name: Microsoft.FSharp.Core.Operators.ignore
HashAlgorithm.TransformBlock(inputBuffer: byte [], inputOffset: int, inputCount: int, outputBuffer: byte [], outputOffset: int) : int
property HashAlgorithm.Hash: byte []
val hashFileAsync : f:string -> Async<string>
Full name: Script.hashFileAsync
type File =
static member AppendAllLines : path:string * contents:IEnumerable<string> -> unit + 1 overload
static member AppendAllText : path:string * contents:string -> unit + 1 overload
static member AppendText : path:string -> StreamWriter
static member Copy : sourceFileName:string * destFileName:string -> unit + 1 overload
static member Create : path:string -> FileStream + 3 overloads
static member CreateText : path:string -> StreamWriter
static member Decrypt : path:string -> unit
static member Delete : path:string -> unit
static member Encrypt : path:string -> unit
static member Exists : path:string -> bool
...
Full name: System.IO.File
File.OpenRead(path: string) : FileStream
More information