이진으로 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 유형을 사용해야 합니다.