8

AWS Glacierサービスについて知り、RESTAPIを介してファイルをアップロードするための小さなPythonアプリケーションを作成したいと思いました。必要なヘッダーを調べて、に遭遇しましx-amz-sha256-tree-hashた。ファイル全体のSHA-256ハッシュと、各1MBチャンクのすべてのハッシュの親のハッシュを計算する必要があります。これにより、次のツリーが作成されます。

AWSのSHA-256ツリーハッシュ手順

(ここから撮影した画像)

私はすでに1MBのチャンクを読み取る関数と、そのハッシュをオンザフライで計算するクラスを作成しましたが、その後、完全に苦労しました。

私のアプリケーションでは、chunkデータを取得してメソッドでハッシュを計算し、__init__親と子(通常のツリーのように)を保持するというクラスを作成しました。ユーザーがファイルを開くと、これらのチャンクインスタンスはそれぞれのハッシュで適切に生成されます(この例では、7つのチャンクインスタンスになります)。

今、私は互いに関連している2つの大きな問題を抱えています。

  1. このツリーを逆に構築するにはどうすればよいですか?基本的に、最下層の2つのチャンクインスタンスごとに新しいチャンクを作成し、それらの2つのハッシュに基づいてハッシュを計算する必要があります。しかし、私はその親をどこに保管しますか?親の子供たちと逆ツリーウォーキングをしますか?
  2. それは奇数の子供たちとどのように機能しますか?各親レイヤーを通過するアルゴリズムがある場合、最後の(0.5 MB)チャンクを見逃します。

私はSOでこのトピックをチェックしましたが、その方法は、常に与えられているわけではない偶数の子カウントでのみ機能します。

この問題を解決する方法/アルゴリズム/アプローチを見つけるのを手伝ってもらえますか?

前もって感謝します!

ポール

4

1 に答える 1

4

最初にレベル数を計算し、次にレベル数を計算します

def proclevel(levels):
    if levels > 0:
        generator = proclevel(levels - 1)
        temp = None
        for firsthash, secondhash in generator:
            if not temp: temp = hashofthem(firsthash, secondhash)
            else: yield temp, hashofthem(firsthash, secondhash); temp = None
        #If odd number of packets
        if temp: yield temp, None
    else:
        temp = None
        for chunk in chunks:
            if not temp: temp = hash(chunk)
            else: yield temp, hash(chunk); temp = None
        if temp: yield temp, None

hashofthemの2番目の引数としてNoneを処理するようにしてください:)

于 2012-08-21T15:37:15.960 に答える