【问题标题】:Linq: How to store MD5 hash column in databaseLinq:如何在数据库中存储 MD5 哈希列
【发布时间】:2011-10-18 17:56:54
【问题描述】:

我需要在数据库中的 md5 哈希列上放置一个索引。我将对 md5 列执行搜索。我打算将哈希存储为 CHAR(32),但我也看到了二进制列选项。将 md5 哈希存储在二进制列或 char(32) 中会更好。我可以使用 Linq to Entities 查询二进制列吗?如果是这样,我将如何处理?

【问题讨论】:

  • 从技术上讲,您可以使用 Base64 (Convert.ToBase64String(bytes)) 来获取 24 字节的字符串,而不是对字节数组进行十六进制处理。

标签: c# sql-server-2008 c#-4.0 linq-to-entities


【解决方案1】:

如果您使用 SQLServer 或任何其他支持 128 位 GUID 类型的服务器...您可以使用 GUID 类型来表示 MD5 值。

由于 MD5 是 16 字节(128 位),您可以轻松地将其转换为 GUID。 为此,您可以在 C# 中使用 Guid 结构和\或手动编写简单的转换例程。

Guid 的格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中 x 是十六进制字符,但在内部存储为 128 位整数,因此它们占用的空间非常小,查询速度非常非常快!

GUIDS 比 char 或 binary 工作得更好,它们是固定大小的,当需要更多位时,它们通常用作键\索引而不是 INT,因为它们具有非常高的速度和低空间消耗。

【讨论】:

  • 问题被标记为 sql-server-2008,所以是的。 :)
  • 大声笑是的 :) 我试图做一个更通用的答案 :) 抽象总是一件好事 :D
【解决方案2】:

如果索引相同,则选择哪种类型都无关紧要,不同之处在于存储。 binary 类型可能会更小,而 char 类型会将值编码为整数。真的在一天结束时我会使用 char 因为它会比二进制更宽容。因此,除非您存储大量这些,数百万个,否则不会有很大的不同。

至于 LINQ,我不确定,但我很确定你可以,它只是字段而不是字段。这是我选择 char 的另一个原因,它使处理 linq 更容易。

【讨论】:

  • 啊,它剥离了我的部分答案,堆栈溢出仍然是新的。应该存在的东西大于小于符号,例如在模板类中。当您在 linq 中引用数据集的字段时,您指定数据来自的列的类型。它将是 char,而不是二进制。
  • 您的意思是像Field<string>() 而不是Field<Binary>()?不确定这与这里有关。它是 EF (L2E),而不是旧的 ADO 2.0 Linq-to-DataSet 东西。 :)
【解决方案3】:

这实际上取决于您如何在代码中表示您的哈希值。如果是字节数组,请继续使用二进制 DB 类型。如果是字符串,请使用它。无论哪种方式,它都是某种级别的二进制数据,这只是告诉计算机在向您显示数据时如何解释它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多