使用PHP获取任何给定输入的唯一哈希值

时间:2015-09-28 13:29:57

标签: php sql hash version-control compare

我需要定期检查许多(100.000' s)行并检查它们的当前状态是否与另一个数据库中的最新存储版本相同。有没有办法为行匹配它们的某种唯一值,或者我是否必须逐列手动检查行?

源数据库是SQL Server 2005数据库,该表没有用于创建,更新和/或删除操作的时间戳机制。我查看了是否有可用的行信息,但唯一可用的是伪列%%lockres%%row information,但这并不能提供日期和/或时间信息

我的工具有限,但我有一个运行Apache和PHP的网络服务器,可以直接访问源数据库和目标数据库。我只对源数据库有读权限。

比较数据和维护源数据库性能的最有效方法是什么。

2 个答案:

答案 0 :(得分:1)

很简单。只需在该表中创建一列,将其命名为 anything 在我的情况下,我使用了令牌名称。 现在,如果您希望在用户注册时自动生成此代码,那么您可以通过以下方式使用它:

$token = bin2hex(random_bytes(20));
$sql_query = "INSERT INTO `table_name` (`token`) VALUES ('$token')";

这里的 bin2hex() 函数表示二进制到十六进制。 random_bytes() 显示在里面生成随机字节,写入你想要选择的随机字符的长度。

或者你可以简单地在你的表中运行这个查询

$token = bin2hex(random_bytes(20));
"UPDATE `table_name` SET `token`='$token'";

如果到目前为止您的查询还没有解决。你可能会再次关心我。那么,我会告诉你另一种解决这个问题的方法。

答案 1 :(得分:0)

由于您无权访问数据库,我建议使用“替代”数据库来存储信息。我可以想到几个不同的方法,每个都有不同的优点和缺点。

方法1

对于在表外使用哈希进行修改检查需要总是再次查询所有数据,使其运行速度非常慢,我会使用单独的表来存储哈希值,您可以随时首先检查值是否匹配然后再更新它。

基本上在插入数据时,您可以根据该数据计算本地哈希值,然后将其与辅助数据库进行比较,如果它们不匹配,您就会知道数据不同步,并且可以将数据更新为真实数据库并将新哈希保存到帮助程序数据库。

优点:

  • 仅对真实数据库进行必要的更新

缺点:

  • 比在数据库中使用哈希值更慢

方法2

始终更新真实数据库中的记录。这是最简单的解决方案,除非您需要同时更新数千条记录,否则远程数据库可以处理额外的负载,性能影响不应该那么大。这只是简单的更新操作。

优点:

  • 简单易行

缺点:

  • 对真实数据库的额外负载

方法3

获得修改远程数据库的权限。如果你要长时间维护这件事,这可能是将来最好的事情。

优点:

  • 工作最快

缺点:

  • 您需要获得修改表格的权限。

虽然我说的是数据库,但最简单的说它可能只是一个纯文本文件,SQLite数据库或任何东西,它可以让你处理本地操作。