我正在使用xxHash
为C#散列值以保持一致性。
ComputeHash
会返回byte[]
,但我需要将结果存储在long
。
我可以使用int32
将结果转换为BitConverter
。这是我尝试过的:
var xxHash = new System.Data.HashFunction.xxHash();
byte[] hashedValue = xxHash.ComputeHash(Encoding.UTF8.GetBytes(valueItem));
long value = BitConverter.ToInt64(hashedValue, 0);
当我使用int
时,这样可以正常工作,但当我更改为ToInt64
时,它会失败。
以下是我得到的例外情况:
目标数组不够长,无法复制集合中的所有项目。检查数组索引和长度。
答案 0 :(得分:8)
构造xxHash
对象时,需要提供hashsize:
var hasher = new xxHash(32);
有效散列大小为32和64。
请参阅https://github.com/brandondahler/Data.HashFunction/blob/master/src/xxHash/xxHash.cs了解来源。
答案 1 :(得分:2)
添加新的答案是因为当前来自Brandon Dahler的xxHash实现使用哈希工厂,您可以在其中使用包含hashsize和种子的配置来初始化工厂:
using System.Data.HashFunction.xxHash;
//can also set seed here, (ulong) Seed=234567
xxHashConfig config = new xxHashConfig() { HashSizeInBits = 64 };
var factory = xxHashFactory.Instance.Create(config);
byte[] hashedValue = factory.ComputeHash(Encoding.UTF8.GetBytes(valueItem)).Hash;
答案 2 :(得分:0)
BitConverter.ToInt64
期望hashedValue
有8个字节(= 64位)。您可以手动扩展,然后传递它。