首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在F#中为key to ShipHash创建16字节数组?

如何在F#中为key to ShipHash创建16字节数组?
EN

Stack Overflow用户
提问于 2019-12-06 22:27:42
回答 2查看 49关注 0票数 0

我正在编写需要散列值的代码。SipHash似乎是一个很好的选择。

代码语言:javascript
复制
  let getSipHashValue (buffer:byte []) (key:byte []) =
    match key.GetLength(0) with
    | 16  -> SipHash24.Hash64(buffer, key)
    | _   -> uint64(0)

有没有一种方法可以将密钥填充到16个字节并确保它正常工作?

我可以得到确切的长度单词作为关键字,但我希望能够使用任何单词(即小于16个字节),并只使用一些填充。

代码语言:javascript
复制
open System
open System.Text

let testKey : byte [] =
  Encoding.UTF8.GetBytes "accumulativeness"

Console.WriteLine("Length: {0}", testKey.GetLength(0))

在F#中有没有办法做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2019-12-06 22:50:33

我想我明白了:

代码语言:javascript
复制
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个字节的问题。对那个语法不太确定。

票数 0
EN

Stack Overflow用户

发布于 2019-12-07 00:24:38

从你的问题中不清楚你想要的填充是什么样子的,但是你可以用零填充:

代码语言:javascript
复制
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)

然后您可以将其与以下内容一起使用:

代码语言:javascript
复制
let padded = pad testKey
printfn "Key length: %d" padded.Length
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59215018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档