2017-12-05 21 views
2

OneDriveと同じ方法でXOrHashを計算したいので、OD4Bバックエンドとの同期に必要な変更を検出できます。OneDrive XOrHashのC#での計算方法

私はXOrHashアルゴリズムの現在の実装では、ここにhttps://docs.microsoft.com/en-us/onedrive/developer/code-snippets/quickxorhash

を見つけることができますが使用しているしかし、私はOD4Bはを提供してくれたハッシュと一致するように我々のコードで同じハッシュを計算する方法を示唆するものは何もありません。

上記のリンクで提供されているXOrHashアルゴリズムを使用して、20バイトの標準長を持つハッシュのバイト配列を取得します。

public static byte[] ComputeHash(string filePath) 
{ 
    using (var quickXor = XOrHash.Create()) 
    { 
     using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
     { 
      return quickXor.ComputeHash(stream); 
     } 
    } 
} 

public static string ConvertHexToString(this byte[] bytes) 
{    
    return Convert.ToBase64String(bytes); 
} 

returns "4FPisLqvTiuaxUVVz6Zk+RxMClE=" OD4B tells us the hash is "LmpqMT5KKX4ATcd372ZTyVr3gIk=" 

明らかに我々は不整合とどのように我々のようhttps://docs.microsoft.com/en-us/onedrive/developer/rest-api/resources/hashes

にハッシュがbase64文字列であることを、任意のコード例やヒントを使用することが提案されている以下のページよりも、この他の上の任意のドキュメントを見つけることができないされていますハッシュを計算する必要がありますし、文字列を返すことは非常に高く評価されます。サンプルファイルへ

リンク:https://dnqa-my.sharepoint.com/:p:/g/personal/autoslave10_dnqauk_co_uk/EcPZl9l2eXNImfD0paFXKyoBHdZwt5mCMRemLKU9wNYIYg?e=63c7632212d948238dd9696c90a11963

OD4BのJSON

{"@odata.context":"omitted","@odata.type":"#oneDrive.item","@odata.id":"omitted","@odata.etag":"\"{D997D9C3-7976-4873-99F0-F4A5A1572B2A},2\"","@odata.editLink":"omitted","createdDateTime":"2017-12-04T17:07:40Z","id":"omitted","lastModifiedDateTime":"2017-12-04T17:07:40Z","name":"pptx001.pptx","file":{"hashes":{"quickXorHash":"LmpqMT5KKX4ATcd372ZTyVr3gIk="},"mimeType":"application/vnd.openxmlformats-officedocument.presentationml.presentation"},"size":29765} 
+2

、期待と実際のハッシュ(今、あなたが期待しているし、実際のハッシュでサンプルファイル(小1)を追加する価値があるが、ファイルがありません) – Evk

+0

上記のハッシュを計算するために使用したサンプルファイルへのリンクを追加しました –

答えて

4

これにより:あなたが実際にあなたの迅速なXORアルゴリズムを使用していない

XOrHash.Create() 

Create()は、静的メソッドHashAlgorithmです。これは、デフォルトのハッシュアルゴリズムインスタンス(私が覚えているようにSHA1)を作成します。それでは、あなたが実際に呼び出していることである。その代わり

HashAlgorithm.Create() 

、このようにそれを実行します。

using (var quickXor = new XOrHash()) 
+0

どのように私はそれを逃しましたか!ありがとうEvk :)あなたは正しいですCreate on HashAlgorithmは、デフォルトであなたにSHA1インスタンスを与えます。 –