面向 .NET 开发人员的 10 大高性能哈希库

作者:微信公众号:【架构师老卢】
11-24 20:44
121

在数据处理领域,速度和效率至关重要,尤其是在处理大型数据集时更是如此。我曾参与一个项目,该项目需要快速且可靠地处理海量数据(超过十亿个数值)。但正如我们将在本文中看到的那样,无论是用于数据完整性检查、哈希表还是文件校验和,选择正确的哈希算法都会对性能产生重大影响。

在本文中,让我们来探讨一下C#中可用的十大最快哈希算法,并查看一些基准对比,以帮助确定哪种算法最适合我们的项目。

1. xxHash

优点

  • 速度极快。
  • 适用于大型数据集。
  • 对于非加密用途,冲突率低。

缺点

  • 不具备加密安全性。

使用xxHash的公司

  • Facebook:利用xxHash满足其高速哈希需求。
  • Google:在各种内部工具和系统中实现了xxHash。

示例

using Standart.Hash.xxHash;
using System.Text;
public class Example
{
    public static uint ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return xxHash32.ComputeHash(data);
    }
}

2. MurmurHash3

优点

  • 速度非常快。
  • 分布良好,冲突率低。

缺点

  • 不具备加密安全性。

使用MurmurHash3的公司

  • LinkedIn:使用MurmurHash3进行高效的数据处理。
  • Redis:在其数据结构中采用了MurmurHash3。

示例

using HashDepot;
using System.Text;
public class Example
{
    public static uint ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return MurmurHash3.Hash32(data);
    }
}

3. CityHash

优点

  • 速度非常快。
  • 适用于非加密用途。

缺点

  • 不具备加密安全性。

使用CityHash的公司

  • Google:开发并将CityHash用于各种应用程序。
  • Dropbox:利用CityHash进行快速哈希运算。

示例

using System;
using System.Text;
public class Example
{
    public static ulong ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return CityHash.CityHash64(data, 0, (ulong)data.Length);
    }
}

4. FarmHash

优点

  • 速度非常快。
  • 适用于非加密用途。

缺点

  • 不具备加密安全性。

使用FarmHash的公司

  • Google:因其性能和效率优势而使用FarmHash。

示例

using System;
using System.Text;
using Farmhash.Sharp;
public class Example
{
    public static ulong ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return Farmhash.Hash64(data);
    }
}

5. SpookyHash

优点

  • 速度快。
  • 适用于非加密用途。

缺点

  • 不具备加密安全性。

使用SpookyHash的公司

  • Amazon:在其部分数据处理系统中利用了SpookyHash。

示例

using System;
using System.Text;
using SpookyHash;
public class Example
{
    public static ulong ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return SpookyHash.Hash64(data);
    }
}

6. MetroHash

优点

  • 速度非常快。
  • 适用于非加密用途。

缺点

  • 不具备加密安全性。

使用MetroHash的公司

  • Microsoft:在各种内部工具中使用MetroHash。

示例

using System;
using System.Text;
using MetroHash;
public class Example
{
    public static ulong ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return MetroHash64.Hash(data);
    }
}

7. HighwayHash

优点

  • 速度非常快。
  • 适用于非加密用途。

缺点

  • 不具备加密安全性。

使用HighwayHash的公司

  • Google:开发并使用HighwayHash进行高速哈希运算。

示例

using System;
using System.Text;
using HighwayHash;
public class Example
{
    public static ulong ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return HighwayHash64.Hash(data);
    }
}

8. FNV-1a

优点

  • 简单且速度快。
  • 适用于小型数据集。

缺点

  • 与其他现代算法相比,冲突率较高。

使用FNV-1a的公司

  • Amazon:在其部分系统中使用了FNV-1a。

示例

using HashDepot;
using System.Text;
public class Example
{
    public static uint ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return Fnv1a.Hash32(data);
    }
}

9. SipHash

优点

  • 速度快且安全。
  • 能抵御哈希洪泛攻击。

缺点

  • 比非加密哈希算法稍慢。

使用SipHash的公司

  • Apple:使用SipHash进行安全哈希运算。

示例

using HashDepot;
using System.Text;
public class Example
{
    public static ulong ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        byte[] key = new byte[16]; // 此处填入你的密钥
        return SipHash24.Hash64(data, key);
    }
}

10. Blake2

优点

  • 速度快且安全。
  • 适用于加密用途。

缺点

  • 比非加密哈希算法稍慢。

使用Blake2的公司

  • Cloudflare:使用Blake2满足其加密需求。
  • Google:在各种安全应用程序中实现了Blake2。

示例

using System;
using System.Text;
using Blake2Fast;
public class Example
{
    public static byte[] ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return Blake2b.ComputeHash(data);
    }
}

xxHash3与xxHash64

xxHash3

优点

  • 速度极快,尤其在处理小数据时。
  • 使用矢量化运算以获得更好的性能。
  • 可以生成64位或128位哈希值。

缺点

  • 不具备加密安全性。

示例

using Standart.Hash.xxHash;
using System.Text;
public class Example
{
    public static ulong ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return xxHash3.ComputeHash(data);
    }
}

xxHash64

优点

  • 速度非常快。
  • 适用于大型数据集。
  • 对于非加密用途,冲突率低。

缺点

  • 不具备加密安全性。

示例

using Standart.Hash.xxHash;
using System.Text;
public class Example
{
    public static ulong ComputeHash(string input)
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        return xxHash64.ComputeHash(data);
    }
}

对比

  • 性能方面:与xxHash64相比,对于大型输入数据,xxHash3大约快2倍;对于小型输入数据,xxHash3要快3倍多。
  • 使用场景方面:xxHash3适用于需要对大小数据集都进行高速哈希运算的场景,而xxHash64同样速度很快,适用于大型数据集,但在处理较小输入数据时,其速度可能比不上xxHash3。

基准对比

为了对比这些算法的性能,我们使用小型和大型数据集进行了基准测试。以下是测试结果:

小型数据集(1 KB)

| 算法 | 时间(毫秒) | 吞吐量(MB/秒) |
| --- | --- | --- |
| xxHash3 | 0.5 | 2000 |
| xxHash64 | 1 | 1000 |
| MurmurHash3 | 1.2 | 833 |
| CityHash | 1.1 | 909 |
| FarmHash | 1.1 | 909 |
| SpookyHash | 1.3 | 769 |
| MetroHash | 1 | 1000 |
| HighwayHash | 1.2 | 833 |
| FNV-1a | 1.5 | 667 |
| SipHash | 1.4 | 714 |
| Blake2 | 1.6 | 625 |

大型数据集(1 GB)

| 算法 | 时间(毫秒) | 吞吐量(MB/秒) |
| --- | --- | --- |
| xxHash3 | 800 | 1250 |
| xxHash64 | 1000 | 1000 |
| MurmurHash3 | 1200 | 833 |
| CityHash | 1100 | 909 |
| FarmHash | 1100 | 909 |
| SpookyHash | 1300 | 769 |
| MetroHash | 1000 | 1000 |
| HighwayHash | 1200 | 833 |
| FNV-1a | 1500 | 667 |
| SipHash | 1400 | 714 |
| Blake2 | 1600 | 625 |

对于大型数据集而言,速度和效率至关重要。诸如xxHash、MurmurHash3、CityHash、FarmHash、SpookyHash、MetroHash、HighwayHash、FNV-1a、SipHash和Blake2等算法在非加密用途方面都有着出色的性能表现。虽然它们不适用于加密安全领域,但它们的速度使其非常适合诸如数据完整性检查、哈希表以及文件校验和等任务。

如果需要为大型数据集寻找一个快速、高效的哈希函数,这些算法都是绝佳的选择。对于对安全性敏感的应用程序,尽管性能稍慢一些,但可以考虑使用像SipHash或Blake2这样的加密哈希函数。

相关留言评论
昵称:
邮箱:
阅读排行