javascript - 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()
,但并非在所有浏览器中都可用
解决方案
虽然评论解决了您的主要担忧,即由于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))
有了这个,您每毫秒只能生成一个哈希,但我认为这不是一个糟糕的权衡。
推荐阅读
- python-3.x - 如何使用python脚本在主动打开的浏览器中查找选项卡名称列表
- javascript - 占位符图像没有正确加载卡片 [ReactJs]
- javascript - 如何限制分页中显示的页面数量
- c# - 如果不在构造函数中,如何验证数据?
- node.js - API 发布 x-www-form-urlencoded 数据但在 json 上失败
- xml - XSLT 通用将结构值类型转换为单值字符串
- c# - 如何使用 sizeof 保留易重构?
- javascript - 如何更改具有相同值而没有突变的对象的键值,同时在 javascript 中保持对未更改键的引用相同?
- vue.js - VueJs - 避免无用的 v-for 迭代
- python-3.x - 余额利息功能