Size: a a a

pgsql – PostgreSQL

2020 July 30

T

The Fallen Phoenix in pgsql – PostgreSQL
The Fallen Phoenix
import { v1 as uuidv1 } from 'uuid';

const v1options = {
  node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab],
  clockseq: 0x1234,
  msecs: new Date('2011-11-01').getTime(),
  nsecs: 5678,
};

uuidv1(v1options);
Тут показано от чего зависит алгоритм
источник

Ð

Ð in pgsql – PostgreSQL
а в чем проблема, в генерации уида с 1900 года? это же просто extract epoch from current_timestamp плюс константа в 70 лет в секундах
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
Заданное время это msecs, nsecs это наносекунды (у вас их нет) и clockseq это такты процессора в пределах наносекунды
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
Ð
а в чем проблема, в генерации уида с 1900 года? это же просто extract epoch from current_timestamp плюс константа в 70 лет в секундах
Ему нужен uuid как я понял
источник

Ð

Ð in pgsql – PostgreSQL
The Fallen Phoenix
Ему нужен uuid как я понял
а я так понял, что ему нужен уид в виде инта с секундами от 1900 года
источник

Ð

Ð in pgsql – PostgreSQL
если бы нужен был обычный форматный ууид - хватило бы и стандартного, зачем эти извращения с секундами, они же там и так внутри есть, для сортировки.
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
Ð
а я так понял, что ему нужен уид в виде инта с секундами от 1900 года
Не, там же написано: типа uuid
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
То есть это не имя столбца а тип.
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
Ща сек, я открою исходники пакета и подсмотрю алгоритм под лупой, может смогу оперативно помочь
источник

Ð

Ð in pgsql – PostgreSQL
а что значит "записать туда значение равное количеству секунд"
источник

Ð

Ð in pgsql – PostgreSQL
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
Тут время нельзя передать
источник

Ð

Ð in pgsql – PostgreSQL
может там смысл в том, чтобы записать 128-битный инт, содержащий число секунд, в поле с типом ууид?
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
function v1({ node = [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], clockseq = 0, msecs = Date.now(), nsecs = 0 }) {
 const b = new Array(16);
 
 clockseq = clockseq & 0x3fff;

 // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
 msecs += 12219292800000;

 // `time_low`
 const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
 b[i++] = (tl >>> 24) & 0xff;
 b[i++] = (tl >>> 16) & 0xff;
 b[i++] = (tl >>> 8) & 0xff;
 b[i++] = tl & 0xff;

 // `time_mid`
 const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff;
 b[i++] = (tmh >>> 8) & 0xff;
 b[i++] = tmh & 0xff;

 // `time_high_and_version`
 b[i++] = ((tmh >>> 24) & 0xf) | 0x10; // include version
 b[i++] = (tmh >>> 16) & 0xff;

 // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
 b[i++] = (clockseq >>> 8) | 0x80;

 // `clock_seq_low`
 b[i++] = clockseq & 0xff;

 // `node`
 for (let n = 0; n < 6; ++n) {
   b[i + n] = node[n];
 }

 return b
}
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
Выдрал логику создания ууида формата 1
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
Который Purely Time-Based
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
const byteToHex = [];

for (let i = 0; i < 256; ++i) {
 byteToHex.push((i + 0x100).toString(16).substr(1));
}

function v1({ node = [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], clockseq = 0, msecs = Date.now(), nsecs = 0 } = {}) {
 let i = 0;
 const b = new Array(16)
 
 clockseq = clockseq & 0x3fff;

 // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
 msecs += 12219292800000;

 // `time_low`
 const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
 b[i++] = (tl >>> 24) & 0xff;
 b[i++] = (tl >>> 16) & 0xff;
 b[i++] = (tl >>> 8) & 0xff;
 b[i++] = tl & 0xff;

 // `time_mid`
 const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff;
 b[i++] = (tmh >>> 8) & 0xff;
 b[i++] = tmh & 0xff;

 // `time_high_and_version`
 b[i++] = ((tmh >>> 24) & 0xf) | 0x10; // include version
 b[i++] = (tmh >>> 16) & 0xff;

 // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
 b[i++] = (clockseq >>> 8) | 0x80;

 // `clock_seq_low`
 b[i++] = clockseq & 0xff;

 // `node`
 for (let n = 0; n < 6; ++n) {
   b[i + n] = node[n];
 }
 
 return (
   byteToHex[b[0]] + byteToHex[b[1]] +
   byteToHex[b[2]] + byteToHex[b[3]] +
   '-' +
   byteToHex[b[4]] + byteToHex[b[5]] +
   '-' +
   byteToHex[b[6]] + byteToHex[b[7]] +
   '-' +
   byteToHex[b[8]] + byteToHex[b[9]] +
   '-' +
   byteToHex[b[10]] + byteToHex[b[11]] + byteToHex[b[12]] +
   byteToHex[b[13]] + byteToHex[b[14]] + byteToHex[b[15]]
 ).toLowerCase();
}

console.log(v1({ msecs: Date.parse('04 Dec 1995 00:12:00 GMT') }))
// 5fc18800-2dd0-11cf-8000-000000000000
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
Ща еще чутка пошаманю
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
const byteToHex = [];

for (let i = 0; i < 256; ++i) {
 byteToHex.push((i + 0x100).toString(16).substr(1));
}

const mapHex = (block = []) => block.map(x => byteToHex[x]).join("")

function v1({ node = [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], clockseq = 0, msecs = Date.now(), nsecs = 0 } = {}) {
 clockseq = clockseq & 0x3fff;
 msecs += 12219292800000; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
 
 const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
 const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff;
 
 const block1 = [ (tl >>> 24) & 0xff, (tl >>> 16) & 0xff, (tl >>> 8) & 0xff, tl & 0xff ]
 const block2 = [ (tmh >>> 8) & 0xff, tmh & 0xff ]
 const block3 = [ ((tmh >>> 24) & 0xf)| 0x10, (tmh >>> 16) & 0xff ]
 const block4 = [ (clockseq >>> 8) | 0x80, clockseq & 0xff ]
 
 return `${mapHex(block1)}-${mapHex(block2)}-${mapHex(block3)}-${mapHex(block4)}-${mapHex(node)}`.toLowerCase();
}

console.log(v1({ msecs: Date.parse('04 Dec 1995 00:12:00 GMT') }))
// 5fc18800-2dd0-11cf-8000-000000000000
источник

T

The Fallen Phoenix in pgsql – PostgreSQL
Тут видно что куда попадает. Больше ничем не могу помочь
источник