【问题标题】:Generating a checksum or hash for field values of a record为记录的字段值生成校验和或哈希
【发布时间】:2012-09-15 12:47:21
【问题描述】:

我希望有一列包含哈希或校验和作为单个值来比较记录。是否有可能在纯 SQL 中做这样的事情?您认为这与 PHP 中的编程解决方案相比更实用吗?

【问题讨论】:

  • MySQL有哈希函数,所以是可以的。但是,正如已经评论过的,重要的是要知道你的哈希是用来做什么的?根据用例,考虑将代码放在应用程序中是否比将代码放在数据库中更有意义。
  • 这是出于完整性或同步(程序化)的目的。
  • @OllieJones 达到 100% :) ?将查看较早的问题。

标签: php mysql hash checksum


【解决方案1】:

是的,这是可能的。 MD5()SHA1()SHA2() 都是可行的哈希函数。

您必须逐行和逐个查询地计算这些函数的值。例如,每次插入一行时,都必须插入哈希值,如下所示:

INSERT INTO x
       name=?name,
       address=?address,
       hash=MD5(CONCAT(?name,?address))

您需要在每次更新时执行类似的操作。如果你弄错了,这非常容易,尤其是当你的表结构发生变化时,你的哈希变得比无用更糟糕。

顺便说一句,MD5 对身份验证不再具有加密安全性。但是,对于封闭系统中的这种散列,它仍然是一个可以接受的选择。

【讨论】:

  • 您可以使用触发器为您执行此操作...但我不禁想知道重点是什么:哈希将始终是基础数据的哈希(除非数据库已经已损坏,但还有其他措施可以检测/处理)。那么它增加了什么价值呢?
  • @eggyal 如果以编程方式同步本地和远程表,它会提供一个可使用的单个值,或者如果只读,则可能提供一个键,因为如果自动增量,PK 将不对应。可以根据要求使用日期字段,但完整性问题也让我感兴趣。
  • @JamesPoulson:为什么不使用replication/clustering 为您执行同步?这是一件很难正确地做的事情,有很多边缘情况。为什么要重新发明轮子?
  • @eggyal 我明白了。我应该提到远程数据库在相互虚拟主机上,端口 3306 经常被关闭。为了给出上下文,有人正确地提到集中在线应用程序访问是一个有趣的想法,但如果互联网连接南下,它就没有多大用处。所以我很好地考虑了如何制作一个离线解决方案来接力。
猜你喜欢
  • 1970-01-01
  • 2020-11-12
  • 2019-08-01
  • 1970-01-01
  • 2013-01-10
  • 2018-09-27
  • 1970-01-01
  • 2021-11-26
  • 2016-03-13
相关资源
最近更新 更多