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

2021-03-27 20:03:40 +08:00
 quxinna
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
1181 次点击
所在节点    JavaScript
1 条回复
quxinna
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 位为一组


修正了一下,大家看看有没有什么问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/765745

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX