Guid для 128-битного целого - PullRequest
0 голосов
/ 04 июня 2018

Мне нужно преобразовать guid в большое целое число ... это нормально, но во время тестирования я выделил кое-что, что мне нужно, объяснили мне, пожалуйста;)

Если я сделаю следующее:

        var g = Guid.NewGuid();     // 86736036-6034-43c5-9b85-1c833837dbea
        var p = g.ToByteArray();
        var x = new BigInteger(p);  // -28104782885366703164142972435490971594

но если я сделаю это на python .. я получу другой результат:

        import uuid
        x = uuid.UUID('86736036-6034-43c5-9b85-1c833837dbea')
        print x
        print x.int  # 178715616993326703606264498842288774122

Может ли кто-нибудь с лучшим знанием Python, а также .net помочь объяснить это?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Просто из любопытства: поменяйте местами несколько байтов :-), а затем добавьте дополнительный байт, если необходимо для знака.

var g = new Guid();
var bytes = g.ToByteArray();

var bytes2 = new byte[bytes[3] >= 0x7F ? bytes.Length + 1 : bytes.Length];

bytes2[0] = bytes[15];
bytes2[1] = bytes[14];
bytes2[2] = bytes[13];
bytes2[3] = bytes[12];
bytes2[4] = bytes[11];
bytes2[5] = bytes[10];
bytes2[6] = bytes[9];
bytes2[7] = bytes[8];

bytes2[8] = bytes[6];
bytes2[9] = bytes[7];

bytes2[10] = bytes[4];
bytes2[11] = bytes[5];

bytes2[12] = bytes[0];
bytes2[13] = bytes[1];
bytes2[14] = bytes[2];
bytes2[15] = bytes[3];

var bi2 = new BigInteger(bytes2);

(я проверил на 1 000 000 случайных Guid ирезультат эквивалентен результату, полученному с помощью метода @spender).

0 голосов
/ 04 июня 2018

Кодирование GUID в байты его компонента - это нестандартизированная операция, которая по-разному обрабатывается на платформах Windows / Microsoft (ИМО в наиболее запутанной форме).

var g = Guid.Parse("86736036-6034-43c5-9b85-1c833837dbea");
var guidBytes = $"0{g:N}"; //no dashes, leading 0
var pythonicUuidIntValue = BigInteger.Parse(guidBytes, NumberStyles.HexNumber);

даст вам питоническое значение из C #

причина .ToByteArray сбоев неявна в инструкциях :

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

Зная это, возможно, можно написатьметод, который не включает в себя путешествие через строки.Упражнение для читателя.

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