我正在玩 FNV-1a 散列。我有一个非常简单的实现,它似乎对 32 位散列和 64 位散列非常有效:
const ulong FNV_PRIME = 0x00000100000001B3;
const ulong FNV_OFFSETBASIS = 0xCBF29CE484222325;
ulong hash = FNV_OFFSETBASIS;
var fileContents = File.ReadAllBytes(@"D:\Some.iso");
foreach(var b in fileContents){
hash ^= b;
hash *= FNV_PRIME;
}
Console.WriteLine(hash);
Console.WriteLine(BitConverter.GetBytes(hash));
对于 32 位散列,我使用了 uint(32 位整数)。对于 64 位哈希,我使用的是 ulong(64 位整数)。
现在,我想试试 128 位版本。但是,C# 没有 128 位整数类型。或者是吗?System.Guid的.NET 文档明确指出(在“备注”下):
GUID 是一个 128 位整数(16 个字节),可用于所有计算机和网络
那么,为什么他们说它是一个 128 位整数呢?我可以对类型进行算术运算吗?我已经尝试过了,但我似乎无法为 System.Guid 类型分配一个数字(例如初始偏移量)。我不能说我很惊讶,但我想知道为什么这么清楚地说明这是一个“128 位整数”。
(原始问题的一种可能的解决方案显然是使用 System.Numerics.BigInteger 库。我在搜索过程中遇到了这个问题,并且想知道 MSDN 上的声明)。