2013-12-11 2 views
2

У меня есть jsfiddle.jQuery .now() не уникально

obj = {}; 
obj[0] = 'hej'; 
obj[1] = 'hopp'; 

$.each(obj, function(key, value) { 
    console.log($.now()); 
}); 

$.now() такой же номер в консоли.

Как я могу создать уникальный номер?

+6

Таким образом, ваш компьютер слишком быстро? – j08691

+3

Если вам нужен действительно уникальный номер, создайте var, который содержит число и увеличит его. Не нужно быть фантазией. Вы можете даже абстрагировать это позади функции, если вам нужно, чтобы она была уникальной для всего приложения и не нуждалась в глобальном count var. –

+2

Вы создаете объект, а затем даете ему ключи '0' и' 1'. звучит скорее как массив для меня. –

ответ

2

У вас может быть счетчик, который увеличивается для каждого объекта. Затем вы можете добавить этот счетчик $ .now(), чтобы убедиться, что он уникален:

obj = {}; 
obj[0] = 'hej'; 
obj[1] = 'hopp'; 
counter=1; 

$.each(obj, function(key, value) { 
    console.log($.now() + counter); 
    counter+=1; 
}); 
0

Конечно, $.now просто отображает текущую временную метку. использовать случайное число Math.random()

+4

он нужен уникальный номер – Vic

+0

Да, он может использовать 'key' для этого. в массиве он будет уникальным. – DoubleYo

2

jQuery.now() не должен дать вам уникальный номер, просто «число, представляющее текущее время» (http://api.jquery.com/jQuery.now/) , В частности, «количество миллисекунд с 1 января 1970 года 00:00:00 UTC» (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime).

Самый простой способ, чтобы генерировать уникальный идентификатор зависит от сферы идентификатор должен быть уникальным в

1:. Если идентификатор просто должен быть уникальным в пределах области действия функции, счетчик как это было предложено SteveP, вероятно, сделает работу лучше всех.

2: Если идентификатор должен быть уникальным в рамках вашего приложения - и у вас нет возможности отслеживать назначенные идентификаторы (как в 1) - ваша задача сложнее. В реальных приложениях жить такой сценарий может быть решена путем объединения метки со случайным числом, вдоль линий

var identifier = $.now() + "_" + Math.round(Math.random() * 1e10) 

Такой подход не гарантирует истинной уникальности identifier хотя с Math.round(Math.random() * 1e10) может вернуться в тот же значение дважды за одну миллисекунду. В зависимости от того, как часто вы генерируете такую ​​строку, все равно будет маловероятно, что вы получите одну и ту же строку дважды.

3: Однако, если вы нацелены на «уникальность в пространстве и времени», вы можете получить вдохновение от http://www.ietf.org/rfc/rfc4122.txt

Следует отметить, что чистые реализации Javascript как Create GUID/UUID in JavaScript? работают только со случайными числами, а также и будет, таким образом, не генерировать действительно уникальных идентификаторов. Для действительно уникальный идентификатор в пространстве и времени действительно уникальный элемент, такой как MAC-адрес, должен использоваться как часть идентификатора.

2

Цитата jquery api:

в $ .now() метод является сокращением числа возвращенного выражение (новая дата) .getTime().

Таким образом, вы в основном используете new Date().getTime(). Однако getTime() не является точным ...Interresting цитаты из this article:

Эффективно эти браузеры только обновить свою внутреннюю GetTime представления каждые 15 миллисекунд. Это означает, что если вы попробуете запросить обновленное время, он всегда будет округлен до последнего , когда таймер был обновлен (что в среднем будет около 7.5 миллисекунд назад).

Вкратце: getTime() не так точен (в некоторых браузерах).

Когда вам нужно случайное число (как вы делаете), используйте:

var randomVal = Math.random(); // e.g. 0.6137274974025786 
var randomValI = Math.round(Math.random()*100000000000000000) // e.g. 6137274974025786 

Если вам нужно более формальный «справ», использовать что-то вроде this:

function createGUID() { 
    function S4() { 
     return (((1+Math.random())*0x10000)|0).toString(16).substring(1); 
    } 

    // then to call it, plus stitch in '4' in the third group 
    return (S4() + S4() + "-" + S4() + "-4" + S4().substr(0,3) + "-" + S4() + "-" + S4() + S4() + S4()).toLowerCase(); 
} 
var guid = createGUID(); 
Смежные вопросы