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