JS哈希函数反转?
JS Hash Function Reversal?
我发现这个函数可以散列一个字符串,我已经尝试了几个小时来反转这个函数来获取散列和 return 字符串。我不太熟悉左移和右移,他们在这个功能的情况下到底做了什么,甚至可以颠倒它吗?我在测试中使用了字符串“luxor”,得到“250B0C5E”作为散列,但无法取回与“luxor”匹配的字符串。我试过从左到右切换班次并移动 charcodeat 但仍然没有成功。
function HashString(command) {
let hash = 0;
let string = command.toLowerCase();
for(let i=0; i < string.length; i++) {
let letter = string[i].charCodeAt();
hash = hash + letter;
hash += (hash << 10 >>> 0);
hash ^= (hash >>> 6);
hash = hash >>> 0
}
hash += (hash << 3);
if (hash < 0) {
hash = hash >>> 0
}
hash ^= (hash >>> 11);
hash += (hash << 15);
if (hash < 0) {
hash = hash >>> 0
}
return hash.toString(16).toUpperCase();
}
你不能。
散列 是一个 one-way 过程。当它是一个 two-way 过程时,它是 encryption/decryption。它们的用途截然不同。
这只是一个散列函数。它采用一个字符串(一系列 16 位值)并生成一个数字(一个 IEEE-754 double-precision 浮点值,一个“double”),然后将其转换为一个十六进制字符串。但是在该过程中的某些地方,由于位移运算符,该值被减少为 32 位,这些运算符在执行它们的工作之前将 double 转换为 32 位二进制补码整数,然后将其转换回等效的 double。
您无法逆转该过程,它是有损(它会丢失信息)。 32 位值中没有空间来存储复制任意长度的 16 位值字符串所需的信息;它可以无损地处理两个字符,或者如果您将范围限制为 16 位值的高位字节为 0 的字符,则可以处理四个字符,但仅此而已。
我发现这个函数可以散列一个字符串,我已经尝试了几个小时来反转这个函数来获取散列和 return 字符串。我不太熟悉左移和右移,他们在这个功能的情况下到底做了什么,甚至可以颠倒它吗?我在测试中使用了字符串“luxor”,得到“250B0C5E”作为散列,但无法取回与“luxor”匹配的字符串。我试过从左到右切换班次并移动 charcodeat 但仍然没有成功。
function HashString(command) {
let hash = 0;
let string = command.toLowerCase();
for(let i=0; i < string.length; i++) {
let letter = string[i].charCodeAt();
hash = hash + letter;
hash += (hash << 10 >>> 0);
hash ^= (hash >>> 6);
hash = hash >>> 0
}
hash += (hash << 3);
if (hash < 0) {
hash = hash >>> 0
}
hash ^= (hash >>> 11);
hash += (hash << 15);
if (hash < 0) {
hash = hash >>> 0
}
return hash.toString(16).toUpperCase();
}
你不能。
散列 是一个 one-way 过程。当它是一个 two-way 过程时,它是 encryption/decryption。它们的用途截然不同。
这只是一个散列函数。它采用一个字符串(一系列 16 位值)并生成一个数字(一个 IEEE-754 double-precision 浮点值,一个“double”),然后将其转换为一个十六进制字符串。但是在该过程中的某些地方,由于位移运算符,该值被减少为 32 位,这些运算符在执行它们的工作之前将 double 转换为 32 位二进制补码整数,然后将其转换回等效的 double。
您无法逆转该过程,它是有损(它会丢失信息)。 32 位值中没有空间来存储复制任意长度的 16 位值字符串所需的信息;它可以无损地处理两个字符,或者如果您将范围限制为 16 位值的高位字节为 0 的字符,则可以处理四个字符,但仅此而已。