JavaScript의 데이터 지문

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.


우선, 나는 내용 주소 찾기 개념을 찾았다.👀
그것은 근본적으로 더욱 높은 성능, 확장성, 안전성을 갖춘 서비스를 구축하는 데 매우 강력한 도구이다.💪
그것은 불변성, 탈중심화, 데이터 완전성, 그리고 더 많은 유행어와 관련이 있다.
그러나 그것도 매우 유용하다. 일반적으로 충분한 중시를 받지 못했기 때문에 나는 실용적인 소개를 써서 그것이 어떻게 진실한 자바스크립트와 함께 일하는지 보여주고 싶다.

무슨 소리야?


컨텐츠 기반 주소 지정을 데이터의 지문으로 볼 수 있습니다.
지문처럼
  • 지문 인식에 따라 한 사람
  • 지문을 개인 고유 ID로 사용
  • 지문에 따라 두 사람이 같은 사람인지 아닌지 판단
  • 한 사람이 데이터베이스에 있는지 지문만으로 빠르게 테스트
  • 상술한 설명에서 "person"을 "data"로 바꾸기만 하면 내용 기반의 주소 찾기 기능을 대체적으로 이해할 수 있습니다.

    너는 너의 데이터가 어디에 있는지 아니?👀
    즉, 컨텐츠 기반 주소 지정을 사용하면 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 함수를 생략하였지만, 핵심 알고리즘을 확실히 명확하게 나타냈다.
    이것은 모든 JavaScript 대상fingerprint의 내용 기반 해시myData를 만듭니다. 이 해시는 우리의 관심 키[ 'keyFoo', 'keyBar' ]를 기반으로 하는 유일한 표시입니다.
    간단히 말하면, 이 지문은 당신에게 두 자바스크립트 대상이 언제 같은지 판단하는 매우 효과적인 방법을 제공합니다.

    If two content-based IDs are the same, the data in those objects is the same.


    깊이 있게 비교할 필요가 없다.Redux는 필요 없습니다.순전히 변하지 않는 선량함.

    그러면 이것은 실제로 어떻게 일을 합니까?



    우리는 이 과정을 세 가지 다른 절차로 나눌 것이다. 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를 입력으로 사용합니다.예를 들어, 이것은 데이터베이스에서 온 모델이나 Redux와 유사한 응용 프로그램 상태를 포함하는 대상일 수 있습니다.
    그 다음으로 우리는 우리가 실제적으로 관심을 가지는 일부 데이터만 고려할 수 있도록 데이터를 정리한다lodash.pick.이 단계는 선택할 수 있지만, 보통 계속하기 전에 이렇게 데이터를 정리하기를 원합니다.나는 실천에서 대부분의 상황에서 데이터 중의 일부분은 사실상 모델의 유일성을 대표하지 않는다는 것을 발견했다. (우리는 이러한 추가 내용을 메타데이터라고 부른다)😉).
    예를 들어, SQL 테이블의 모든 행에 대해 고유한 ID를 생성하려는 경우대부분의 SQL 구현은 테이블에 메타데이터를 추가합니다. 예를 들어 항목의 창설이나 수정 날짜입니다. 우리는 이 메타데이터가 우리의 유일한 개념에 영향을 주기를 원할 수 없습니다.다시 말하면, 만약 두 줄이 서로 다른 시간에 표에 삽입되지만, 응용 프로그램의 업무 논리에 따라 완전히 같은 값을 가지고 있다면, 우리는 그것들을 같은 지문을 가지고 있다고 여기기 때문에, 우리는 이러한 추가 메타데이터를 필터링할 것이다.
    셋째, 우리는 정리된 데이터를 안정적이고 효율적인 표현으로 간소화하여 저장하고 빠른 비교에 사용할 수 있다.대부분의 상황에서 이 단계는 특정한 cryptographic hash 규범화와 관련된다. 우리가 독특하고 간결한 방식으로 내용을 인용하는 방식.
    위의 코드에서 우리는 해시가 stable인지 확인하기를 희망한다. 이것은 fast-json-stable-stringify 패키지를 통해 쉽게 실현할 수 있다.
    이 좋은 패키지는 우리의 자바스크립트 대상이 어떻게 구성되었든지, 키의 순서가 어떻든지, 두 개의 깊이가 같은 대상에 대해 항상 같은 문자열을 출력할 수 있도록 귀속적으로 확보한다.
    이 해석은 약간의 세부 사항을 덮어 놓았지만, 이것이 바로 NPM ecosystem 의 아름다운 점이다. 우리는 모든 세부 사항을 이해하고 추상적으로 이용할 필요가 없다.

    우리 는 이 일 을 분명히 하자



    뭐 공부 해요?
    지금까지 우리는 사물의 해시 방면을 소홀히 했기 때문에 코드에서 어떤 모습인지 봅시다.
    const hasha = require('hasha')
    
    const hash = (input) => hasha(input, { algorithm: 'sha256' })
    
    주의, 여러 가지 방법으로 hash 함수를 정의할 수 있다.이 예는 매우 흔히 볼 수 있는 SHA256 해시 함수를 사용하고 결과를 출력하는 64자 16진 인코딩을 사용합니다.
    다음은 출력 지문의 예입니다. 2d3ea73f0faacebbb4a437ff758c84c8ef7fd6cce45c07bee1ff59deae3f67f5이곳은 해시를 대체하기 위해 노드를 사용하는 것이다.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')
    }
    
    우리의 목적에서 이 두 가지 해시 실현은 등효적이다.
    여기서 기억해야 할 가장 중요한 것은 암호화 해시 함수로 출력이 치밀하고 유일한 지문을 출력하기를 원한다는 것이다. 입력 데이터가 변하면 지문이 변하고, 입력 데이터가 변하지 않으면 지문도 변하지 않는다는 것이다.

    그럼 여기서 어디까지 가야 돼요?


    데이터가 어떻게 그 내용에 의해 유일하게 정의되는지 생각하기 시작하면 응용 프로그램은 정말 무궁무진하다.
    다음은 내가 개인적으로 이런 방법이 유용하다는 것을 발견한 몇 가지 용례이다.
  • Saasify에서 서버 기능이 없는 불가변 배치를 위한 유일한 식별자를 생성합니다.나는 ZEITlambda배치와 패키지 의존성을 최적화하기 위해 매우 유사한 방법을 사용했다는 것을 안다.
  • 우리가 Automagical에서 영상을 생성하는 데이터베이스 모델에 따라 영상을 생성하는 유일한 표지부호.만약 두 동영상이 같은 지문을 가지고 있다면, 그것들은 반드시 같은 내용을 가지고 있어야 한다.여기서 주의해야 할 것은 산열하기 전에 데이터에 버전 번호를 추가하는 것이 일반적으로 유용하다는 것이다. 왜냐하면 비디오 렌더기의 변경은 출력 비디오의 변경을 초래하기 때문이다.
  • 캐시는 서로 다른 항목과 계정에 같은 파라미터를 가진 테이프 계획과 쿠폰입니다.
  • React webapp에서 클라이언트 모델과 HTTP 메타데이터를 캐시합니다.
  • 우리는 사실상 콘텐츠 주소 찾기 기능의 표면에 닿기 시작했다.JavaScript로 이런 심리 변화를 실현하는 것이 얼마나 간단한지 보여주고 이런 방법이 가져다 주는 장점을 조금 소개했으면 좋겠습니다.
    만약 네가 이 물건들을 좋아한다면, 나는 네가 가서 보라고 건의한다.

  • The power of content-based addressing - 좋은 주제 소개입니다. IPFS에 사용된 내용 식별자(CID)를 중점적으로 소개했습니다.

  • Multihashes - 해시를 묘사합니다.💪

  • Merkle trees - 내용 기반의 해시 위에 구축된 귀속 데이터 구조.

  • Rabin fingerprinting - 내용 기반의 해시를 사용하는 효율적인 문자열 검색 알고리즘.

  • IPFS - Starter File System.

  • libp2p - 분산 응용을 위한 모듈식 구축 블록입니다.

  • Saasify - 개발자가 수동적인 수입을 얻기 쉽다...읊다, 읊조리다😂
  • 감사합니다.🙏

    좋은 웹페이지 즐겨찾기