InfoGrab DocsInfoGrab Docs

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

요약

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

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

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

이 작업을 더 쉽게 하려면 모델에 ShaAttribute 컨선을 포함하고 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.4
원문 보기

요약

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

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

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

이 작업을 더 쉽게 하려면 모델에 ShaAttribute 컨선을 포함하고 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 타입을 사용해야 합니다.