对于我们的每个二进制资产,我们生成MD5哈希.这用于检查某个二进制资产是否已存在于我们的应用程序中.但两个不同的二进制资产是否可能生成相同的MD5哈希值.那么两个不同的字符串是否可能生成相同的MD5哈希?
我正在构建一个系统,它需要能够找到是否已更新blob字节.我认为我应该计算它的校验和,存储它并稍后计算相同的校验和,以查看博客是否已更新,而不是存储整个blob(它们可以高达5MB).
目标是最小化以下(按此顺序):
我们的系统碰撞不超过1/1,000,000是可以接受的.问题不在于安全性,而在于更新/错误检测,因此罕见的冲突是可以的.(这就是为什么我把它放在最小化的东西中).
另外,我们不能自己修改文本的blob.
当然,md5
,crc
或sha1
浮现在脑海中,如果我想要一个快速的解决方案,我去了.然而,不仅仅是一个快速的解决方案,我正在寻找可以比较不同方法以及利弊的东西.
MD5算法的时间复杂度是多少?我在网上找不到确切的答案。我认为复杂度是 O(n) 但我不确定。
我有一个集成项目的数据库模式,我需要能够在其中查询已更改的记录,但仅基于该记录中的给定字段集.
所以,例如,这是一个示例表:
顾客
我需要查询以获取其名称,电话或传真字段已更改的记录.但是,不应考虑其他字段,即如果只有Balance字段更改,我的查询不应该拉入该记录(因此,每当修改记录时,自动更新的时间戳字段不起作用).
此外,这必须在许多不同的数据库和平台上运行,因此除非它们在MySQL,PostgreSQL,SQL Server和SQLLite上运行,否则TRIGGERS或类似的东西不是真正的选择.
这些字段由我无法修改的第三方应用程序修改,因此我不能只添加标志并让第三方应用程序在修改相关字段时将标志设置为TRUE.
我最初的解决方案是计算相关字段的HASH并将其存储在新字段"LastHash"中.然后,我可以计算当前记录中数据的相关字段的哈希值,如果它与存储的LastHash不匹配,我知道它已被更改.
这看起来很混乱......但似乎它会起作用.有没有更好的办法?如果没有,是否有一种很好的方法来实现该哈希,以便提取那些已更改的记录是有效的,而不是太耗时?
编辑
一些说明:我的应用程序和其他应用程序都更新并插入到这些表中.我可以让我的应用程序计算初始哈希值.我不能让其他应用程序计算它.
每当记录更改都可以自动更新的时间戳列,这些列很容易在使用不同列类型或非常简单的触发器的所有数据库系统中进行复制.
其他问题
如果哈希是要走的路......有没有任何有效的哈希算法,不会永远计算所有这些记录?MD5或SHA1可能会起作用,但它们看起来像是sllloowwww.
我有一个发送数据单元的假设情况,每个数据单元都有一千个字节.故障率很少,但是当发生错误时,它不太可能是单个位错误,并且更可能是连续几位中的错误.
起初我想过使用校验和,但显然可能会错过大于一位的位错误.奇偶校验也不起作用,因此CRC可能是最佳选择.
使用循环冗余校验是否有效千字节?或者还有其他方法可以更好地运作吗?
checksum data-link-layer crc error-detection telecommunication
不同之处在于它们产生的长度.
crc32()提供32位代码
sha1()给出128位代码
md5()给出160位代码
这样对吗??或者它们之间是否还有其他差异?
MD5,MD6 ?,所有SHA-somethings,CRC-somethings.我以前用过它们,看过它们用在各个地方,但我不知道为什么你会用到另一个.
在很高的层面上,所有这些3/4字母缩略词之间的差异在性能,碰撞概率和一般难以破解方面有何不同?这些中的任何一个取决于我正在散列的数据类型或数量吗?
当我选择一个而不是另一个时,我做了什么权衡?我已经读过CRC不适合用于安全性,但是对于一般的哈希表冲突避免呢?
我有一个 MySQL 数据库,我正在 PHP 中处理它,它将从每日数据馈送中执行地址验证。我们最终会进行地址更正,因为我们无法控制提要的来源。
我正在尝试提出一种方法来查看源地址是否已更改。如果它发生变化,那么将在我们的 MySQL 数据库上用 PHP 执行地址验证。
如果不存储旧提要的副本,我认为最好对提要中的字段进行校验和并将其与每条记录一起存储。然后,此后的每个提要都会查看校验和是否已更改。这是最好的方法吗?可能已经有一个 PHP 函数来完成这一切了吗?MySQL 中的某些东西呢?谢谢!