Mam proste pytanie, które pojawiło się, gdy chciałem zapisać wynik skrótu SHA1 w bazie danych MySQL:
Jak długo powinno być pole VARCHAR, w którym przechowuję wynik skrótu?
mysql
database-design
hash
sha1
niklasfi
źródło
źródło
Odpowiedzi:
Używałbym
VARCHAR
do danych o zmiennej długości, ale nie do danych o stałej długości. Ponieważ wartość SHA-1 ma zawsze długość 160 bitów, poVARCHAR
prostu zmarnuje dodatkowy bajt na długość pola o stałej długości .Nie chciałbym też przechowywać wartości, którą
SHA1
zwraca. Ponieważ wykorzystuje tylko 4 bity na znak, a zatem wymagałoby 160/4 = 40 znaków. Ale jeśli używasz 8 bitów na znak, potrzebujesz tylko pola o długości 160/8 = 20 znaków.Dlatego polecam użycie
BINARY(20)
iUNHEX
funkcję do konwersjiSHA1
wartości na binarną.Porównałem wymagania dotyczące przechowywania dla
BINARY(20)
iCHAR(40)
.Z milionem rekordów
binary(20)
zajmuje 44,56 mln, podczas gdychar(40)
zajmuje 64,57 mln.InnoDB
silnik.źródło
UNHEX()
ręcznie plik sql.Skrót SHA1 ma 40 znaków!
źródło
Odniesienie zaczerpnięte z tego bloga:
Poniżej znajduje się lista algorytmów haszujących wraz z wymaganymi rozmiarami bitów:
Utworzono jedną przykładową tabelę z wymaganym CHAR (n):
źródło
Rozmiar wyjściowy sha1 to 160 bitów. To jest 160/8 == 20 znaków (jeśli używasz 8-bitowych znaków) lub 160/16 = 10 (jeśli używasz 16-bitowych znaków).
źródło
Tak więc długość wynosi od 10 16-bitowych znaków do 40 cyfr szesnastkowych.
W każdym razie zdecyduj, jaki format chcesz przechowywać, i ustaw pole o stałym rozmiarze na podstawie tego formatu. W ten sposób nie będziesz miał zmarnowanej przestrzeni.
źródło
Możesz nadal używać VARCHAR w przypadkach, gdy nie zawsze przechowujesz hash dla użytkownika (np. Uwierzytelnianie kont / zapomnienie adresu URL logowania). Gdy użytkownik uwierzytelnił / zmienił swoje dane logowania, nie powinien być w stanie użyć skrótu i nie powinien mieć powodu do tego. Możesz utworzyć oddzielną tabelę do przechowywania tymczasowego skrótu -> skojarzenia użytkowników, które można usunąć, ale nie sądzę, aby większość ludzi przejmowała się tym.
źródło
Jeśli potrzebujesz indeksu w kolumnie sha1, sugeruję CHAR (40) ze względu na wydajność. W moim przypadku kolumna sha1 jest tokenem potwierdzającym e-mail, więc na landing page zapytanie wchodzi tylko z tokenem. W tym przypadku moim zdaniem najlepszym wyborem jest CHAR (40) z INDEXEM :)
Jeśli chcesz zastosować tę metodę, pamiętaj o pozostawieniu $ raw_output = false.
źródło