Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DELIMITER $$
- DROP FUNCTION IF EXISTS old_password_compat$$
- CREATE FUNCTION old_password_compat(p_pass VARCHAR(255))
- RETURNS VARCHAR(16)
- DETERMINISTIC
- BEGIN
- DECLARE nr BIGINT UNSIGNED DEFAULT 1345345333;
- DECLARE add_ BIGINT UNSIGNED DEFAULT 7;
- DECLARE nr2 BIGINT UNSIGNED DEFAULT 305419889; -- 0x12345671
- DECLARE tmp BIGINT UNSIGNED;
- DECLARE i INT DEFAULT 1;
- DECLARE ch INT;
- DECLARE len INT;
- -- убираем пробелы по краям
- SET p_pass = TRIM(p_pass);
- SET len = CHAR_LENGTH(p_pass);
- WHILE i <= len DO
- SET ch = ORD(SUBSTRING(p_pass, i, 1));
- -- пропускаем ' ' и TAB, как в оригинальном алгоритме
- IF ch <> 32 AND ch <> 9 THEN
- SET tmp = ((nr & 63) + add_) * ch + (nr << 8);
- SET nr = nr ^ tmp;
- SET nr2 = nr2 + ((nr2 << 8) ^ nr);
- SET add_ = add_ + ch;
- -- имитация 31-битного диапазона (0x7FFFFFFF)
- SET nr = nr & 2147483647;
- SET nr2 = nr2 & 2147483647;
- END IF;
- SET i = i + 1;
- END WHILE;
- RETURN CONCAT(
- LPAD(LOWER(HEX(nr)), 8, '0'),
- LPAD(LOWER(HEX(nr2)), 8, '0')
- );
- END$$
- DELIMITER ;
Advertisement
Add Comment
Please, Sign In to add comment