InfoGrab DocsInfoGrab Docs

SHA1 해시를 바이너리로 저장하기

요약

SHA1 해시를 문자열로 저장하는 방식은 공간 효율이 좋지 않습니다. 반면, SHA1을 바이너리로 저장하면 실제 SHA1 데이터에 20바이트만 필요하고, 추가 공간은 1~4바이트 정도(데이터베이스 내부 구조에 따라 다름)만 사용합니다.

SHA1 해시를 문자열로 저장하는 방식은 공간 효율이 좋지 않습니다. 문자열 형태의 SHA1은 최소 40바이트가 필요하고, 인코딩 정보를 저장하기 위한 추가 바이트 1개, 그리고 PostgreSQL 내부 구조에 따라 더 많은 공간이 필요할 수 있습니다.

반면, SHA1을 바이너리로 저장하면 실제 SHA1 데이터에 20바이트만 필요하고, 추가 공간은 1~4바이트 정도(데이터베이스 내부 구조에 따라 다름)만 사용합니다. 즉, 최상의 경우 공간 사용량을 50% 줄일 수 있습니다.

이를 더 쉽게 사용하기 위해 모델에 ShaAttribute 컨선(concern)을 포함시키고 sha_attribute 클래스 메서드를 사용하여 SHA 속성을 정의할 수 있습니다. 예를 들면 다음과 같습니다:

class Commit < ActiveRecord::Base
  include ShaAttribute

  sha_attribute :sha
end

이렇게 하면 sha 속성 값을 바이너리로 저장하면서도 문자열처럼 사용할 수 있습니다. 즉, 데이터를 올바른 바이너리 형식으로 변환하는 것에 대해 신경 쓰지 않고도 다음과 같은 작업을 수행할 수 있습니다:

commit = Commit.find_by(sha: '88c60307bd1f215095834f09a1a5cb18701ac8ad')
commit.sha = '971604de4cfa324d91c41650fabc129420c8d1cc'
commit.save

단, 한 가지 요건이 있습니다. SHA를 저장하는 데 사용되는 칼럼은 반드시 바이너리 타입이어야 합니다. Rails에서는 :text:string 대신 :binary 타입을 사용해야 합니다.

SHA1 해시를 바이너리로 저장하기

GitLab v19.1
원문 보기
요약

SHA1 해시를 문자열로 저장하는 방식은 공간 효율이 좋지 않습니다. 반면, SHA1을 바이너리로 저장하면 실제 SHA1 데이터에 20바이트만 필요하고, 추가 공간은 1~4바이트 정도(데이터베이스 내부 구조에 따라 다름)만 사용합니다.

SHA1 해시를 문자열로 저장하는 방식은 공간 효율이 좋지 않습니다. 문자열 형태의 SHA1은 최소 40바이트가 필요하고, 인코딩 정보를 저장하기 위한 추가 바이트 1개, 그리고 PostgreSQL 내부 구조에 따라 더 많은 공간이 필요할 수 있습니다.

반면, SHA1을 바이너리로 저장하면 실제 SHA1 데이터에 20바이트만 필요하고, 추가 공간은 1~4바이트 정도(데이터베이스 내부 구조에 따라 다름)만 사용합니다. 즉, 최상의 경우 공간 사용량을 50% 줄일 수 있습니다.

이를 더 쉽게 사용하기 위해 모델에 ShaAttribute 컨선(concern)을 포함시키고 sha_attribute 클래스 메서드를 사용하여 SHA 속성을 정의할 수 있습니다. 예를 들면 다음과 같습니다:

class Commit < ActiveRecord::Base
  include ShaAttribute

  sha_attribute :sha
end

이렇게 하면 sha 속성 값을 바이너리로 저장하면서도 문자열처럼 사용할 수 있습니다. 즉, 데이터를 올바른 바이너리 형식으로 변환하는 것에 대해 신경 쓰지 않고도 다음과 같은 작업을 수행할 수 있습니다:

commit = Commit.find_by(sha: '88c60307bd1f215095834f09a1a5cb18701ac8ad')
commit.sha = '971604de4cfa324d91c41650fabc129420c8d1cc'
commit.save

단, 한 가지 요건이 있습니다. SHA를 저장하는 데 사용되는 칼럼은 반드시 바이너리 타입이어야 합니다. Rails에서는 :text:string 대신 :binary 타입을 사용해야 합니다.