سؤال

لدي سؤال بسيط مما حدث عندما أردت أن متجر نتيجة SHA1 تجزئة في قاعدة بيانات MySQL:

متى يجب VARCHAR مجال يكون في متجر التجزئة هي النتيجة ؟

هل كانت مفيدة؟

المحلول

وأود أن استخدام VARCHAR البيانات طول متغير، ولكن ليس مع البيانات طول ثابت. لأن قيمة SHA-1 هو <م> دائما طويل 160 بت، VARCHAR أن مجرد إضاعة <لأ href = "http://dev.mysql.com/doc/refman/5.1/en/storage-requirements أتش تي أم أل "يختلط =" noreferrer "> بايت إضافي لطول حقل طول ثابت و.

وأنا أيضا لن تخزين قيمة SHA1 تعود. لأنه يستخدم فقط 4 بت لكل حرف، وبالتالي ستحتاج 160/4 = 40 حرفا. ولكن إذا كنت تستخدم 8 بت لكل حرف، وكنت بحاجة حقل 160/8 = 20 شخصية طويلة فقط.

وهكذا فإنني أوصي لكم لاستخدام BINARY(20) و و UNHEX لتحويل القيمة إلى SHA1 ثنائي.

وقارنت متطلبات التخزين لBINARY(20) و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
);

ومع مليون من سجلات binary(20) يأخذ 44.56M، في حين يأخذ char(40) 64.57M. محرك InnoDB.

نصائح أخرى

وتجزئة SHA1 40 حرف طويلة!

المرجعية التي اتخذت من هذه المدونة:

وفيما يلي قائمة من خوارزمية التجزئة جنبا إلى جنب مع تتطلب بت الحجم:

  • MD5 = 128 بت تجزئة القيمة.
  • SHA1 = 160 بت تجزئة القيمة.
  • SHA224 = 224 بت تجزئة القيمة.
  • SHA256 = 256 بت تجزئة القيمة.
  • SHA384 = 384 بت تجزئة القيمة.
  • SHA512 = 512 بت تجزئة القيمة.

إنشاء عينة واحدة طاولة تتطلب شار(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)
);

وحجم الناتج من SHA1 هو 160 بت. وهو 160/8 == 20 حرف (إذا كنت تستخدم حرف 8 بت) أو 160/16 = 10 (إذا كنت تستخدم 16 بت حرف).

وبالتالي فإن طول ما بين 10 حرف 16 بت، و 40 رقما عرافة.

في أي حال تقرر شكل أنت ذاهب لتخزين، وجعل الحقل حجم ثابت بناء على هذا الشكل. بهذه الطريقة سوف لا يكون لديك أي مساحة مهدرة.

وأنت قد لا تزال ترغب في استخدام VARCHAR في الحالات التي لا تخزن دائما تجزئة للمستخدم (أي مصادقة رابط حسابات / نسيت تسجيل الدخول). بمجرد مصادقة مستخدم / تغيير معلومات تسجيل الدخول الخاصة بهم لا ينبغي أن تكون قادرة على استخدام التجزئة، وينبغي أن يكون لديها سبب ل. هل يمكن إنشاء جدول منفصل لتخزين التجزئة مؤقتة -> الجمعيات المستخدم التي يمكن حذفها لكنني لا أعتقد أن معظم الناس تهتم لذلك

إذا كنت بحاجة إلى الفهرس على عمود SHA1، أقترح CHAR (40) لأسباب تتعلق بالأداء. في حالتي العمود SHA1 هو تأكيد رمز البريد الإلكتروني، حتى على الصفحة المقصودة يدخل الاستعلام فقط مع الرمز المميز. في هذه الحالة CHAR (40) مع INDEX، في رأيي، هو أفضل خيار:)

إذا كنت تريد أن تعتمد هذه الطريقة، تذكر أن ترك $ raw_output = كاذبة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top