无冲突的高性能哈希?

问题描述 投票:1回答:1

下面的哈希函数是从this post大量借用的,但是在我的应用程序中有太多的冲突。

public static class Hashing
{
  private const int FNV1a_offsetBias = unchecked( ( int )0x81_1c_9d_c5 );
  private const int FNV1a_prime = 16_777_619;

  public static int FNV1a(params dynamic[] values) {
     var hash = FNV1a_offsetBias;

     foreach ( var value in values )
        hash = FNV1a_Crank(hash, value.GetHashCode());

     return hash;
  }

  private static int FNV1a_Crank(int start, int addendum) {
     unchecked {
        start *= FNV1a_prime;
        start += addendum;
     }

     return start;
  }
}

我需要保证唯一的高性能哈希。我意识到它可能需要比上面的函数慢一些,但是我希望找到不会显着慢一些的东西。上面链接的SE帖子非常有趣且有用,但也让我感到困惑,不知道该使用什么。

哈希的用例是这样:我有一个应用程序,每天可以将数百万条记录插入数据库。插入的表包含唯一键,因此任何违反唯一性的插入都将引发异常。我不允许抛出这些异常,因为它太慢了,最好避免其他原因。因此,我使用上面的函数对每个插入的复合唯一键中的列值进行哈希处理并将其存储在哈希表中。在每次插入之前,我都会生成一个哈希并在哈希表中查找哈希。如果不存在,那么我可以安全地插入。如果存在,则该记录已经存在,因此我跳过了插入。

这非常快,我以为一开始就可以。但是后来我发现数十种情况(数百万种)中的哈希冲突,因此我的应用程序认为已经插入了一条记录,而实际上并没有。因此我丢失了记录,这对于企业来说是不可接受的。

以下是一些我正在散列的数据的示例:

Hasher("Z125",  "99-8ZG10", "SpecialZ_S07181_2");
Hasher("G125");
Hasher("G99-76", "F78_XYZ_92323");

所以我正在寻找一种ac#函数,该函数提供最快的散列算法,可以保证唯一性。换句话说,我需要一种高性能的方法来检查数百万次该记录是否已经存在于表格?散列似乎是最快的方法,但是唯一性是最重要的。

有什么想法吗?

c# hash cryptography
1个回答
0
投票

看来您的目标是为数据库记录生成唯一的标识符。通常,您的数据库系统将允许您为数据库记录设置主键,然后系统将确保该主键在整个数据库中是唯一的。这样的主键通常足以用于许多应用程序。但是,还需要考虑其他几件事,例如:

  • 标识符是否必须很难猜测,或者仅仅是“看起来随机”。
  • 标识符是否是唯一授予记录访问权限的东西。

生成唯一标识符的最佳方法取决于这些问题和其他问题,我将在“ Unique Random Identifiers”部分中给出这些问题。您应该使用我在该部分中提出的六个问题的答案来编辑问题帖;答案将进一步建议使用哪种标识符。但是,如果您不能忍受这种情况下存在重复标识符的风险,那么随机数和列值的哈希都不适合作为唯一标识符。

© www.soinside.com 2019 - 2024. All rights reserved.