Javascript. 将MD5散列转换为整数

6

在Javascript中是否可以将像这样的内容转换为整数:d131dd02c5e6eec4 693d9a0698aff95c 2fcab58712467eab 4004583eb8fb7f89,这是MD5哈希函数的结果?


你需要整数做什么?你可以将其转换为字符串,但不能准确地转换为JavaScript数字。 - Ry-
我正在尝试实现Chord协议。 - AndreiBogdan
你唯一能够将它转换为整数的方法是使用某种形式的替换来将字母替换为数字,这会产生一系列其他问题... - Justin
@AndreiBogdan:那么,要实现Chord协议,您需要对哈希(作为整数)进行什么计算? - Ry-
2
在描述协议的文章中,它说:“一致性哈希函数使用SHA-1作为基本哈希函数,为每个节点和键分配一个m位标识符。通过对节点的IP地址进行哈希运算来选择节点的标识符[...]”。因此,我可以通过比较字符串将这些值“排列在圆圈周围”,但后来它说每个节点都有一系列的后继节点:“s = successor(n+2^i),其中0 <= i <= m-1(所有算术运算都是模2^m)。”在MD5的情况下(我正在使用),m为128。我可能错了,但我需要能够对哈希函数执行模运算。o.O - AndreiBogdan
我需要整数来找出哪些后继节点在+1 +2 +4 +8 .... "n"处,其中n应该是一个数字... o.O 我开始觉得我在这里没有理解到什么,但我无法确定具体是什么。 - AndreiBogdan
4个回答

7

可能不是完美的,但这符合我的需求。

export function stringToIntHash(str, upperbound, lowerbound) {
  let result = 0;
  for (let i = 0; i < str.length; i++) {
    result = result + str.charCodeAt(i);
  }

  if (!lowerbound) lowerbound = 0;
  if (!upperbound) upperbound = 500;

  return (result % (upperbound - lowerbound)) + lowerbound;
}

我非常喜欢这个解决方案,因为它很简单(由于依赖ASCII码),可以在服务器上轻松复制,但是对我来说缺少的是,假设输入是均匀随机选择的字符串,我希望概率分布在两个边界之间保证是均匀的。 - Ivan

4

ES6 版本,将字符串转换为介于 0-9 之间的整数:

string.split('').map(i => i.charCodeAt(0)).reduce((a, b) => a + b, 0) % 10

2
也许这个https://github.com/lovell/farmhash可以符合要求?
const farmhash = require('farmhash');
const hexDigest = crypto.createHash('md5').update().digest('hex');
farmhash.fingerprint64(hexDigest);

1

看起来像是一个十六进制数字,你可以尝试使用parseInt函数并传入基数为十六:

var num = parseInt(string, 16);

编辑:这种方法实际上并不起作用。有关详细信息,请参见评论。


它在我的控制台返回一个数字...一个巨大的数字,但这是一些东西。我不确定它最终变得多精确。 - Ryan Endacott
非常不精确。或者,如果您保留了空格,只需第一部分。 - Ry-
它是错误的。parseInt:~9.462148622078087e+76。实际值为94621486220780871705971335405839374945966571586290374999485260302979719462793,可被3整除但不能被2整除。 - Ry-
3
这个答案真的应该被接受吗?评论似乎表明这不是正确的方法,或者我有什么误解吗? - aug
1
如果您需要一个随机数,可以从哈希值中取一个子字符串(8、12个八位字节),然后使用parseInt()函数转换为数字。 - epx
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接