Guid到128bit整数

时间:2018-06-04 11:10:42

标签: c# python-2.7

我需要将一个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 :(得分:4)

将GUID编码到其组件字节是一种非标准化操作dealt with differently on Windows/Microsoft platforms(IMO以最令人困惑的方式)。

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#

中的pythonic值

the instructions隐含.ToByteArray失败的原因:

  

开始的四字节组和接下来的两个双字节组的顺序相反,而最后两个字节组和结束六字节组的顺序相同。

知道这一点,可能编写一个不涉及通过字符串跳转的方法。为读者练习。

答案 1 :(得分:3)

出于好奇,在这里和那里交换一些字节:-)然后在符号需要时添加一个额外的字节。

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方法获得的结果。