【问题标题】:Calculate the same Checksum in Oracle, SQLServer and C# for a ResultSet在 Oracle、SQLServer 和 C# 中为 ResultSet 计算相同的校验和
【发布时间】:2016-07-07 15:32:29
【问题描述】:

我需要为 Oracle、SQL Server 和 C# 中的结果集计算校验和,因为我想检查它们是否都相等。

样本数据:

CREATE TABLE [dbo].[TestTable](
    [ParentArticleNumber] [nvarchar](50) NOT NULL,
    [ArticleNumber] [nvarchar](50) NOT NULL,
    [Amount] [decimal](18, 4) NOT NULL
)
GO
Insert Into TestTable (
    ParentArticleNumber
    , ArticleNumber
    , Amount) 
values 
    ('Art1', 'Art3', 10.5)
    , ('Art1', 'Art2', 20)
    , ('Art4', 'Art2', 22.35)
Go

在 C# 中,字段的类型为 stringdecimal

示例查询:

Select 
    ArticleNumber
    , Amount
From
    TestTable
Where
    ParentArticleNumber = 'Art1'

任何想法如何计算在每个系统上得到相同结果的校验和?

【问题讨论】:

  • 你为什么要这样做?这是一个非常不寻常的请求,它不会扩展到超过(非常)几千行。您要解决的实际问题是什么?简单地检测变化?查找更改的行?两个数据库都有自己的更改跟踪机制,可以扩展到数百万行
  • 通常结果集的大小约为 40 行。它不必扩展到数千行。实际的问题是非常低的带宽我必须在程序运行时检查 DB A 中的结果集是否与 DB B 中的结果集相同。大约 98% 的情况是这种情况校验和的想法很小我必须在全球范围内传输的数据量。
  • 这就是为什么你需要解释你的实际问题,而不是你试图解决它的原因。听起来您正在尝试使用 SQL Express 在船舶之间同步数据,并在卫星上使用 Oracle DB 上的 HQ 数据。有几种方法可以解决这个问题 1) 在船上和总部都使用 C# 计算散列,并在它们之间传输散列。更少的带宽,往返的延迟更高。您可以仅在数据更改时计算哈希值,并缓存该值。 2)无论如何将数据从总部推送到船舶。这样可以节省您的往返行程和...
  • 3) 维护版本号而不是哈希,并且仅发送自上次同步以来的上/下更改。比较上传/下载的版本,看看这艘船是否需要请求更多的更改。有许多同步协议可以解决这种情况,不要尝试自己动手。例如 git 使用它的变体来同步多个存储库

标签: c# .net sql-server oracle


【解决方案1】:

使用常见的哈希函数,例如 MD5。

注意:这假设您想做一个非常简单的校验和,如果您正在做与安全相关的哈希,还有其他一些注意事项。具体来说:如果此输入来自不受信任的用户并且他们不应触发哈希冲突,请使用比 MD5 更安全的算法。

我不会发布示例,因为这基本上只是搜索 MD5 + 任何您想要为其进行哈希的平台。

SQL:HashBytes

Generate MD5 hash string with T-SQL

C#:System.Security.Cryptography.MD5.Create().ComputeHash

calculate a MD5 hash from a string

甲骨文: DBMS_CRYPTO

How to call Oracle MD5 hash function?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多