2016-03-21 6 views
0

Oracle、SQL ServerおよびC#で結果セットのチェックサムを計算する必要がある。ResultSetのOracle、SQLServer、およびC#で同じチェックサムを計算する

サンプルデータ:フィールドはタイプstringdecimalである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 

サンプルクエリ:

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

任意のアイデアをどのように取得するチェックサムのようなものを計算します各システムで同じ結果が得られますか?

+0

なぜそれをしたいですか?これは**非常に珍しいリクエストです。ちょうど数千の行以上に拡張されることはありません。あなたが解決しようとしている*実際の問題は何ですか?変更を検出するだけですか?変更された行を探しますか?両方のデータベースには、何百万行にも及ぶチェンジトラッキングのための独自の機構があります。 –

+0

通常、結果セットのサイズは約40行です。それは、千の行に拡大縮小する必要はありません。実際の問題は、DB Aの結果セットがDB Bの結果セットと同じ場合、プログラムの実行時にチェックする必要がある非常に低い帯域幅です。これは、約98%の場合です。チェックサムのアイデアは、データ量は世界中で送信する必要があります。 – VSDekar

+0

そのため、実際の問題を解決しようとするのではなく、実際の問題を説明する必要があります。サテライト経由でOracle DB上のHQデータとSQL Expressを使用して、船間でデータを同期しようとしているようです。これにはいくつかのアプローチがあります。1)船とHQの両方でC#を使用してハッシュを計算し、それらの間でハッシュを送信します。帯域幅が小さく、ラウンドトリップのレイテンシがはるかに大きくなります。データが変更されたときにのみハッシュを計算し、値をキャッシュすることができます。 2)HQから船にデータを押し込む。これは、あなたに往復を節約し、... –

答えて

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?

関連する問題