首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在给定32字节的md5字符串的情况下获得一致的n点散列/频谱

如何在给定32字节的md5字符串的情况下获得一致的n点散列/频谱
EN

Stack Overflow用户
提问于 2019-06-11 17:24:00
回答 1查看 307关注 0票数 2

我想对一些内容进行md5哈希,然后生成n个点的“曲线”或“谱”。也就是说,假设在从0到1的一条线上绘制5、10或20个点,其分布方式对于md5散列是唯一的(冲突并不重要)。基本上,它看起来就像是原子的光发射光谱。

这些点(或谱中的线)以某种方式基于提供的md5散列生成,并且n提供了您想要的线的数量。

所以它会是这样的:

代码语言:javascript
复制
function generateSpecrum(md5, n) { return [ ... ] }

默认情况下,它可以只返回0到1之间的值,但您可能会给它一个起始值和结束值来生成范围。

想知道如何在伪代码或JS中做到这一点。

然而,标准md5散列的可能性很多。我只会这么做:

代码语言:javascript
复制
var crypto = require('crypto')
var data = 'foo'
crypto.createHash('md5').update(data).digest('hex')
// acbd18db4cc2f85cedef654fccc4a4d8

所以一个32字节的字符串。在我的例子中,它不需要产生全局唯一的值,可能会有一些冲突,但如果有一种方法可以让它从不同的md5输入产生各种光谱,那将是很酷的。

EN

回答 1

Stack Overflow用户

发布于 2019-06-12 06:33:43

让我们忽略字符串数据是md5打印的部分,转而关注如何对任意长度的十六进制字符串执行此操作,以便我们可以使用任何我们喜欢的摘要(从CRC32到SHA-512):

  1. 从色调渐变背景开始(我们可以在CSS中做到这一点),
  2. 将字符串转换为位打印(内置到JS中),
  3. 将对应于零位的任何区域涂黑。

作为可运行的代码片段:

代码语言:javascript
复制
function hexstr2bin(stringinput) {
  // let's not be constrained by JS integer precision,
  // which is only good for 53 bits. Technically we don't
  // care what the "numbers" are here, we just want the
  // ones and zeros that the numbers turn into.
  return stringinput.split('').map(c => (
    parseInt(c, 16).toString(2).padStart(4,'0')
  )).join('');
}

function renderSpectrum(stringinput) {
  let cvs = document.createElement('canvas');
  let bits = Array.from(hexstr2bin(stringinput));

  cvs.width = bits.length;
  cvs.height = 1;
  ctx = cvs.getContext('2d');
  ctx.strokeStyle = 'black';
 
  bits.forEach( (bit,i) => {
    if (bit === "0") {
      ctx.moveTo(i,0);
      ctx.lineTo(i,1);
      ctx.stroke();
    }
  });

  document.body.appendChild(cvs);
};

renderSpectrum("acbd18db4fccc4a4d8");
renderSpectrum("c5887c91d0002f2a869a4b0772827701");
renderSpectrum("06956ff032d78e090d0d292aa9d8e7143ab08cf1ed444944529f79a4f937306a");
代码语言:javascript
复制
canvas {
  width: 100%;
  height: 40px;
  background: linear-gradient(
    to right,
    violet, blue, cyan, green, yellow, orange, red
  );
}

将画布拉伸到100%宽度意味着你可以免费获得模糊效果。奖金!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56540479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档