Достаточно ли большого дома для ша1?

0

Я хочу знать, достаточно ли BigInt по размеру. Я создал registration.php, где пользователь получает по электронной почте ссылку активации учетной записи, чтобы проверить его электронную почту, чтобы активировать его учетную запись.

Ссылка активации учетной записи в этом формате:

[PHP]

$account_activation_link = 
"http://www.".$site_domain."/".$social_network_name."/activate_account.php?primary_website_email=".$primary_website_email."&account_activation_code=".$account_activation_code."";

[/PHP]

Код активации учетной записи находится в таком формате:

$ account_activation_code = sha1 ((строка) mt_rand (5, 30)); //Type. Перетащите INT в STRING по 1-му параметру sha1, поскольку он должен быть STRING.

Теперь следующая ссылка была отправлена по электронной почте: http://www.myssite.com/folder/[email protected]&account_activation_code=22d200f8670dbdb3e253a90eee5098477c95c23d

Обратите внимание, что код активации учетной записи, полученный с помощью sha1: 22d200f8670dbdb3e253a90eee5098477c95c23d

Но в моем mysql db, в столбце "account_activation_code", я вижу только: "22". Остальная часть кода активации отсутствует. Это почему? Столбец установлен в BigInt. Разве этого недостаточно для размещения кода Sha1? Что вы предлагаете?

Благодарю вас

Теги:
sha1
bigint

3 ответа

0

Методы хэширования, такие как SHA-1, производят двоичные значения, которые имеют длину 160+ бит в зависимости от используемого варианта. Общий SHA256 один имеет длину 256 бит. Криптографический хэш не будет вписываться в 64-битное поле BIGINT, потому что 64-битные хэши бесполезно малы, у вас не будет ничего, кроме столкновений.

Обычно люди хранят хеши в виде их шестнадцатеричных эквивалентов в столбце VARCHAR(255). Они могут быть проиндексированы и достаточно хорошо выполняются в большинстве ситуаций, особенно в тех случаях, когда вы периодически выполняете поиск на основе кликов. С точки зрения производительности и хранения здесь нет проблем.

0

Короткий ответ: BIGINT слишком мал.

Хэш - это в основном поток бит (160 бит в случае SHA-1). Хотя это, безусловно, возможно сделать эти биты в качестве базового 2-го числа и преобразовать его в базу 10, для этого вам понадобится действительно большое хранилище (насколько я знаю, это не так, чтобы видеть целочисленные переменные размером более 64 бит), и там aren Очевидные преимущества. BIGINT - это 64-разрядный тип, поэтому он не может выполнять эту работу.

Если у вас нет веских оснований хранить его как число, я бы просто использовал двоичный тип столбца или его шестнадцатеричное представление простого текста в добром старом VARCHAR (последний, как правило, более практичен для обработки).

  • 0
    Пожалуйста, не будьте человеком в вашей команде, который хранит хеши в виде сырых двоичных файлов в базе данных. Это невероятно раздражает, так как вы не можете вырезать и вставлять эти значения для специальных запросов, а их проверка требует много дополнительной работы. Экономия пространства настолько незначительна, что если вы не столкнетесь с буквальными триллионами этих вещей, вы никогда не заметите.
  • 1
    @tadman Ты прав. Я не хотел рекомендовать двоичный текст поверх текста, я просто хотел подчеркнуть двоичную природу хэшей. Я постараюсь улучшить формулировку.
-2

Вы пытаетесь сохранить строку в BigInt. Это ваша проблема. SHA-хеши - это сочетание буквенно-цифровых символов, а не только чисел. Измените поле на VARCHAR, и все будет в порядке

  • 0
    Ватц, хорошо, спасибо. Я попытаюсь. Но сколько лимитов цифр я должен поставить для VarChar здесь? Я вижу 40 цифр в этом примере, но я не уверен, будет ли это всегда максимум 40 цифр или нет.
  • 0
    Хэши @PhpLearner SHA1 имеют длину 40 символов
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню