이진으로 SHA1 해시 저장

SHA1 해시를 문자열로 저장하는 것은 공간을 효율적으로 사용하는 것이 아닙니다. 문자열로 표현된 SHA1은 적어도 40바이트가 필요하며, 인코딩을 저장하는 추가적인 바이트가 필요하며, 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 유형을 사용해야 합니다.