我正在编写需要散列值的代码。SipHash似乎是一个很好的选择。
let getSipHashValue (buffer:byte []) (key:byte []) =
match key.GetLength(0) with
| 16 -> SipHash24.Hash64(buffer, key)
| _ -> uint64(0)有没有一种方法可以将密钥填充到16个字节并确保它正常工作?
我可以得到确切的长度单词作为关键字,但我希望能够使用任何单词(即小于16个字节),并只使用一些填充。
open System
open System.Text
let testKey : byte [] =
Encoding.UTF8.GetBytes "accumulativeness"
Console.WriteLine("Length: {0}", testKey.GetLength(0))在F#中有没有办法做到这一点?
发布于 2019-12-06 22:50:33
我想我明白了:
open System
open System.Text
let rec getPaddedBytes (s:string) =
let b = Encoding.UTF8.GetBytes s
match b.GetLength(0) with
| 16 -> b
| x when x < 16 -> getPaddedBytes (s + "0")
| _ -> b[0..15]
Console.WriteLine("Length: {0}", testKey.GetLength(0))
let testBytes = getPaddedBytes "accum"
let testString = Encoding.UTF8.GetString testBytes
Console.WriteLine("X: {0}", testString)我需要解决获取前16个字节的问题。对那个语法不太确定。
发布于 2019-12-07 00:24:38
从你的问题中不清楚你想要的填充是什么样子的,但是你可以用零填充:
let getPadding (bs: byte[]): byte[] =
let rem = bs.Length % 16
let padBytes = if rem = 0 then 0 else (16 - rem)
Array.zeroCreate padBytes
let pad (bs: byte[]): byte[] =
Array.append bs (getPadding bs)然后您可以将其与以下内容一起使用:
let padded = pad testKey
printfn "Key length: %d" padded.Lengthhttps://stackoverflow.com/questions/59215018
复制相似问题