首页 > 解决方案 > javascript中类似代码块的输出有何不同

问题描述

为什么输出在以下方面有所不同:

https://appmagic.io/modern/1

https://appmagic.io/modern/1

let urlHash = {};
const rootURL = 'http://tinyurl.com/';

var encode = function(longUrl) {
  let hash = Date.now().toString(36);
   urlHash[hash] = longUrl;
  return `${rootURL}${hash}`
};
var decode = function(shortUrl) {
    return urlHash[shortUrl.substring(rootURL.length)]
};

let url1 = encode("https://appmagic.io/classic/1");
let url2 = encode("https://appmagic.io/modern/1");
console.log(decode(url1));
console.log(decode(url2));

https://appmagic.io/classic/1

https://appmagic.io/modern/1

let urlHash = {};
const rootURL = 'http://tinyurl.com/';

var encode = function(longUrl) {
  let hash = Date.now().toString(36);
    console.log({hash}); // difference in code
    console.log({hash}); // difference in code
   urlHash[hash] = longUrl;
  return `${rootURL}${hash}`
};
var decode = function(shortUrl) {
    return urlHash[shortUrl.substring(rootURL.length)]
};

let url1 = encode("https://appmagic.io/classic/1");
let url2 = encode("https://appmagic.io/modern/1");
console.log(decode(url1));
console.log(decode(url2));

我的猜测是:

由于Date.now()以毫秒为单位给出值,没有控制台(IO 操作,即耗时的同步操作),它们在纳秒内得到评估,并且哈希保持不变,所以在第一种情况下类似的输出

但是,如果我们添加控制台(IO 操作,即耗时的同步操作),它会将操作延迟超过毫秒,并且在第二种情况下会出现不同的输出。

我不确定我的看法是否正确。任何人都可以提供更好/正确的解释。

如果我的猜测是正确的,我怎样才能创建无冲突的快速哈希,

考虑使用window.performance.now(),但并非在所有浏览器中都可用

标签: javascriptdateecmascript-6

解决方案


虽然评论解决了您的主要担忧,即由于encode函数在同一毫秒内运行多次,可能会生成相同的哈希,但我想将其留在这里作为通过将哈希推迟到唯一键来解决该问题的示例生成:

function Coder(rootUrl) {
  const urlHash = {}
  
  return {
    encode(longUrl) {
      let hash
      
      do {
        hash = Date.now().toString(36)
      } while (urlHash[hash])
      
      urlHash[hash] = longUrl
      
      return `${rootUrl}${hash}`
    },
    
    decode(shortUrl) {
      return urlHash[shortUrl.substring(rootUrl.length)]
    }
  }
}

// usage example
const { decode, encode } = Coder('http://tinyurl.com/')

const url1 = encode('https://appmagic.io/classic/1')
const url2 = encode('https://appmagic.io/modern/1')

console.log('url1 encoded', url1)
console.log('url2 encoded', url2)

console.log('url1 decoded', decode(url1))
console.log('url2 decoded', decode(url2))

有了这个,您每毫秒只能生成一个哈希,但我认为这不是一个糟糕的权衡。


推荐阅读