Чем отличается вывод для аналогичного кодового блока в javascript - PullRequest
0 голосов
/ 19 февраля 2020

Почему выходные данные отличаются следующим:

  • 1-й сценарий: отпечатки

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));
  • 2-й сценарий: отпечатков

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() дает значения в миллисекундах, без консоли (операция ввода-вывода, т.е. время потребляя операции syn c), они получают оценку в нано-секундах, а ha sh остается тем же, поэтому аналогичный вывод в 1-м сценарии

Но если мы добавляем консоль (операция ввода-вывода, т. е. требующая много времени syn * 1062) * операции) это задерживает работу на более чем миллисекунду, и во втором сценарии появляется другой вывод.

Я не уверен, правильно ли мое восприятие. Может ли кто-нибудь предоставить лучшее / правильное объяснение.

Если моя догадка верна, как я могу создать быстрый без столкновений ха sh,

, думая использовать window.performance.now(), но он также доступен не во всех браузерах

1 Ответ

1 голос
/ 24 февраля 2020

В то время как комментарии касаются вашей основной проблемы, что возможно генерировать один и тот же га sh из-за функции 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))

При этом вы сможете генерировать только один га sh за миллисекунду, но я полагаю, что это неплохой компромисс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...