データフィンガープリンティング
11289 ワード
I want to talk a little about how you can use content-based addressing (aka data fingerprinting) as a general approach to make your applications faster and more secure with some practical JavaScript examples.
まず最初に、私はコンテンツベースのアドレッシングAPの概念を見つける.👀
これは、基本的によりパフォーマンスの高い、スケーラブルで安全なサービスを構築するための非常に強力なツールです.💪
それは、不変性、分権化、データ完全性とより多くの流行語に関連します.
しかし、それはあまりにも有用であり、一般的に私はいくつかの現実世界のJavascriptと一緒にどのように動作するかを示すために実用的なイントロを書きたいと思った一般的に評価されます.
何の地獄の話ですか?
コンテンツベースのアドレッシングをデータのフィンガープリントと考えることができます.
どのように指紋を許可するように:
上記の説明の「データ」と「人」を交換してください、そして、あなたは内容ベースのアドレシングが可能にするものの大まかな概要を持っています.
あなたのデータがどこにあるか知ってる?👀
別の方法を置くと、コンテンツベースのアドレッシングは、一意または効率的にデータのIDまたはURLのような外部とは対照的にそれの実際のコンテンツに基づいて参照することができます.
データベース生成されたID、ランダムなGuid、およびURLは、すべて自分の権利で有用ですが、彼らはデータの指紋と同じくらい強力ではありません.
閉じるこの動画はお気に入りから削除されています
これが私が実際に使用している現実のコードをどのように見てみましょうか
const pick = require('lodash.pick')
const stableStringify = require('fast-json-stable-stringify')
const data = pick(myData, ['keyFoo', 'keyBar'])
const fingerprint = hash(stableStringify(data))
このスニペットはhash
関数(以下でそれ以上)を残しますが、かなり明確にコアアルゴリズムを表します.それは、我々が
fingerprint
について気にかけるキーに基づいてそのオブジェクトのユニークな表現であるどんなJavaScriptオブジェクトmyData
の内容ベースのハッシュ[ 'keyFoo', 'keyBar' ]
を作成します.要するに、この指紋は、2つのJavaScriptオブジェクトが同じであるとき、あなたに非常に効率的な方法を話すことを提供します.
If two content-based IDs are the same, the data in those objects is the same.
深い比較のための必要はありません.reduxの必要はありません.ちょうど純粋な不変の善.
では、これは実際にどのように動作しますか?
このプロセスを3つのステップに分けて,1)入力データ2)データクリーニング3)簡素化.
JavaScriptコードを見てみましょう.
const pick = require('lodash.pick')
const stableStringify = require('fast-json-stable-stringify')
const data = pick(myData, ['keyFoo', 'keyBar'])
const fingerprint = hash(stableStringify(data))
まず、JavaScriptオブジェクトmyData
を入力します.これはあなたのデータベースまたはいくつかのオブジェクトのようなアプリケーションのようなアプリケーションの状態を含むモデルかもしれません.第二に、我々は我々が我々が実際に
lodash.pick
を介して気にするデータの一部を考慮していることを確認するために我々のデータをクリーンアップします.この手順は省略可能ですが、通常は前にこのようにデータを消去します.私は実際には、ほとんどの時間は、実際にあなたのモデルの一意性を代表していないあなたのデータの一部であることを発見した😉).例として、SQLテーブルのすべての行に一意のIDを作成したいとしましょう.ほとんどのSQL実装では、エントリが作成されたか変更された日付のようなテーブルにメタデータを追加します.そして、このメタデータを一意性の概念に影響させたくないでしょう.言い換えれば、2つの行が異なる時間でテーブルに挿入されたが、我々のアプリケーションのビジネスロジックに従って、まったく同じ値を持っている場合、我々は、この余分なメタデータをフィルタアウトするので、同じ指紋を持っているとして扱うようにしたい.
第三に、我々は、我々は保存し、迅速な比較のために使用できる安定した、効率的な表現に我々の浄化されたデータを簡素化します.ほとんどの時間は、このステップは、我々がユニークで簡潔な方法で我々の内容を参照する方法を正常化するために、cryptographic hashの何らかの種類を含みます.
上のコードでは、ハッシングがstableであることを確認したいと思います.これはfast-json-stable-stringifyパッケージによって簡単にできます.
この素晴らしいパッケージは、私たちのJavaScriptオブジェクトがどのように構築されたのか、あるいはどのようなキーが入っているかに関係なく、それは常に深い等値を持つ任意の2つのオブジェクトに対して同じ文字列表現を出力することを確実にします.
この説明についてはいくつかの詳細がありますが、それはNPM ecosystemの美しさです-私たちは、抽象化を利用するためにすべてのビット&ピースを理解する必要はありません.
ハッシュしましょう
Whatshaまで?
今までのところ、私たちは物事のハッチングな側面について調べました.
const hasha = require('hasha')
const hash = (input) => hasha(input, { algorithm: 'sha256' })
hash
関数を定義できるさまざまな方法があります.この例では、非常に一般的なSHA256ハッシュ関数を使用し、結果の64文字の16進符号化を出力します.以下は出力例の指紋です
ここでは、ノードを使用する別のハッシュ実装です.JS暗号パッケージ
const crypto = require('crypto')
const hash = (d) => {
const buffer = Buffer.isBuffer(d) ? d : Buffer.from(d.toString())
return crypto.createHash('sha256').update(buffer).digest('hex')
}
これらのハッシュ実装の両方は我々の目的のために同等です.ここで留意すべき最も重要なことは、暗号化ハッシュ関数を使用して、入力データが変わらない場合には、入力データが変化し、同じままである場合に変更される、コンパクトでユニークな指紋を出力したいということです.
それでここからどこへ行けばいいですか。
一旦そのデータがどのようにデータがユニークに定義されることができるかについて考え始めるならば、アプリケーションは本当に無限です.
ここでいくつかのユースケースがあります.
あなたがこのものを楽しむならば、私はチェックアウトを推薦します
The power of content-based addressing -彼らがIPFSで使われるように、内容識別子(CIDS)に集中して、話題へのものすごいイントロ.
Multihashes -ハッシュの自己記述.💪
Merkle trees -コンテンツベースのハッシュの上に構築された再帰的なデータ構造.
Rabin fingerprinting -コンテンツベースのハッシングを使用する効率的な文字列検索アルゴリズム.
IPFS -惑星間ファイルシステム.
libp2p -分散アプリケーションのためのモジュラービルディングブロック.
Saasify - DEVSが受動的収入を得る簡単な方法.ああ待って、それは私の会社であり、それは実際にコンテンツベースのアドレッシングに関連していないが、私はいくつかのスラッシュhahaをカット😂
Reference
この問題について(データフィンガープリンティング), 我々は、より多くの情報をここで見つけました https://dev.to/transitivebullshit/data-fingerprinting-in-javascript-ojmテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol