Pergunta

Eu tenho uma pergunta simples que ocorreu quando eu queria armazenar o resultado de um hash SHA1 em um banco de dados MySQL:

Quanto tempo deve a VARCHAR campo seja em que eu armazenar o resultado do haxixe?

Foi útil?

Solução

Gostaria de usar VARCHAR para dados de comprimento variável, mas não com os dados de comprimento fixo. Como um valor de SHA-1 é sempre 160 pouco longo, o VARCHAR seria apenas desperdiçar um byte complementar para o comprimento do campo de comprimento fixo .

E eu também não armazenar o valor a SHA1 está retornando. Porque ele usa apenas 4 bits por caractere e, portanto, seria necessário 160/4 = 40 caracteres. Mas se você usar 8 bits por caractere, você só precisa de um campo longo 160/8 = 20 caracteres.

Então, eu recomendo que você use BINARY(20) UNHEX função para converter o valor SHA1 para binário.

Eu comparei os requisitos de armazenamento para BINARY(20) e CHAR(40).

CREATE TABLE `binary` (
    `id` int unsigned auto_increment primary key,
    `password` binary(20) not null
);
CREATE TABLE `char` (
    `id` int unsigned auto_increment primary key,
    `password` char(40) not null
);

Com milhões de registros binary(20) leva 44.56M, enquanto char(40) leva 64.57M. InnoDB motor.

Outras dicas

Um hash SHA1 é de 40 caracteres de comprimento!

Referência tomadas a partir deste blog:

Abaixo está uma lista de algoritmo de hash juntamente com o seu exigem tamanho do bit:

  • = MD5 valor de 128 bits de hash.
  • SHA1 = valor hash de 160 bits.
  • SHA224 = valor hash de 224 bits.
  • SHA256 = valor de hash de 256 bits.
  • SHA384 = valor de hash de 384 bits.
  • SHA512 = valor de 512 bits hash.

mesa de uma amostra Criado com exigem CHAR (n):

CREATE TABLE tbl_PasswordDataType
(
    ID INTEGER
    ,MD5_128_bit CHAR(32)
    ,SHA_160_bit CHAR(40)
    ,SHA_224_bit CHAR(56)
    ,SHA_256_bit CHAR(64)
    ,SHA_384_bit CHAR(96)
    ,SHA_512_bit CHAR(128)
); 
INSERT INTO tbl_PasswordDataType
VALUES 
(
    1
    ,MD5('SamplePass_WithAddedSalt')
    ,SHA1('SamplePass_WithAddedSalt')
    ,SHA2('SamplePass_WithAddedSalt',224)
    ,SHA2('SamplePass_WithAddedSalt',256)
    ,SHA2('SamplePass_WithAddedSalt',384)
    ,SHA2('SamplePass_WithAddedSalt',512)
);

Tamanho de saída de sha1 é 160 bits. Que é 160/8 == 20 caracteres (se você usar caracteres de 8 bits) ou 160/16 = 10 (se você usar caracteres de 16 bits).

Assim, o comprimento é de entre 10 caracteres de 16 bits, e 40 dígitos hexadecimais.

Em qualquer caso decidir o formato que você está indo para armazenar e tornar o campo um tamanho fixo com base nesse formato. Dessa forma, você não terá qualquer espaço desperdiçado.

Você ainda pode querer usar VARCHAR nos casos em que você nem sempre armazenar um hash para o usuário (ou seja, autenticação contas url login / esqueceu). Uma vez que um utilizador autenticado / mudou sua informação de login não deve ser capaz de usar o hash e não deve ter nenhum motivo para isso. Você poderia criar uma tabela separada para armazenar hash de temporária -.> Associações de usuários que poderiam ser excluídos, mas eu não acho que a maioria das pessoas se preocupam em fazer isso

Se você precisa de um índice na coluna sha1, sugiro CHAR (40) por motivos de desempenho. No meu caso a coluna sha1 é um token de confirmação de e-mail, por isso na página de destino a consulta entra apenas com o token. Neste caso CHAR (40) com o índice, na minha opinião, é a melhor escolha:)

Se você quiser adotar este método, lembre-se de deixar $ raw_output = false.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top