V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
quxinna
V2EX  ›  JavaScript

引自 blueimp javascript md5 的移位代码是这样移位的吗?

  •  
  •   quxinna · 2021-03-27 20:03:40 +08:00 · 1298 次点击
    这是一个创建于 1374 天前的主题,其中的信息可能已经有所发展或是发生改变。
    x[len >> 5] |= 0x80 << len % 32
    x[(((len + 64) >>> 9) << 4) + 14] = len

    数组排序长度右移 5 位,或十六进制 80 十进制 128,左移模长度 32
    数组排序长度加 64,右移 5 位,加 14,赋值给长度

    function safeAdd(x, y) {
    var lsw = (x & 0xffff) + (y & 0xffff)
    var msw = (x >>> 16) + (y >>> 16) + (lsw >>> 16)
    return (msw << 16) | (lsw & 0xffff)
    }

    x 取 16 位加 y 取 16 位的和
    x 取 16 位加 y 取 16 位的和乘以二
    x 取 16 位加 y 取 16 位的和乘以二减 16 位取 16 位

    function bitRotateLeft(num, cnt) {
    return (num << cnt) | (num >>> (32 - cnt))
    }

    num 左移 cnt 位,num 右移 32-cnt 位乘以二

    function binl2rstr(input) {
    var i
    var output = ''
    var length32 = input.length * 32
    for (i = 0; i < length32; i += 8) {
    output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff)
    }
    return output
    }

    长度乘以 32
    数组排序长度左移 5 位左移模长度 32 取 16 位

    function rstr2binl(input) {
    var i
    var output = []
    output[(input.length >> 2) - 1] = undefined
    for (i = 0; i < output.length; i += 1) {
    output[i] = 0
    }
    var length8 = input.length * 8
    for (i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32
    }

    长度乘以 8
    数组排序长度右移 5 位,数组排序长度除以 8 取 16 位左移模长度 32
    quxinna
        1
    quxinna  
    OP
       2021-04-04 21:17:04 +08:00
    x[len >> 5] |= 0x80 << len % 32
    x[(((len + 64) >>> 9) << 4) + 14] = len

    四个字节一组
    数组排序长度*8 右移 5 位,或十六进制 80 十进制 128 左移数组排序长度*8 模 32 数组
    数组排序长度*8 加 64 右移 9 位,左移 4 位,加 14,赋值长度

    function safeAdd(x, y) {
    var lsw = (x & 0xffff) + (y & 0xffff)
    var msw = (x >>> 16) + (y >>> 16) + (lsw >>> 16)
    return (msw << 16) | (lsw & 0xffff)
    }

    x 和 y 为 32 位
    x 取后 16 位加 y 取后 16 位的和
    x 取前 16 位加 y 取前 16 位的和加 x 取后 16 位加 y 取后 16 位的和取头部
    x 取前 16 位加 y 取前 16 位的和加 x 取后 16 位加 y 取后 16 位的和取头部加 x 取后 16 位加 y 取后 16 位的和
    即 x+y

    function bitRotateLeft(num, cnt) {
    return (num << cnt) | (num >>> (32 - cnt))
    }

    32 位 num 左移 cnt 位,32 位 num 右移 32-cnt,连接起来

    function binl2rstr(input) {
    var i
    var output = ''
    var length32 = input.length * 32
    for (i = 0; i < length32; i += 8) {
    output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff)
    }
    return output
    }

    数组长度 5 位为一组,数组按字符连接起来

    function rstr2binl(input) {
    var i
    var output = []
    output[(input.length >> 2) - 1] = undefined
    for (i = 0; i < output.length; i += 1) {
    output[i] = 0
    }
    var length8 = input.length * 8
    for (i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32
    }

    数组按 32 位连接起来,数组成员长度 32 位为一组


    修正了一下,大家看看有没有什么问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1015 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:28 · PVG 04:28 · LAX 12:28 · JFK 15:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.