Windows phone SDK中获取udid的方法是:
byte[] DeviceUniqueId = DeviceExtendedProperties.GetValue("DeviceUniqueId") as byte[];
由于udid在windows phone SDK的API中获取的返回值是一20字节byte数组,若直接转为ASCII码会出现各种符号,在用http get方法向服务器传送时url难免会出现解析错误的问题。
所以想到将这20字节数组直接拼成一数字字符串,将数组的每一元素不够三位数的前面补0,得到一字符串方法如下:
private static string GetUserId() { StringBuilder sb = new StringBuilder(); byte[] DeviceUniqueId = DeviceExtendedProperties.GetValue("DeviceUniqueId") as byte[]; if (DeviceUniqueId != null) { //return MD5.GetMd5String(DeviceUniqueId); foreach (byte b in DeviceUniqueId) { if (b < 10) //0-9 { sb.Append("00"); } else if (b < 100) //10-99 { sb.Append("0"); } sb.Append(b); } } return sb.ToString(); }
得到到是一60字节长度的字符串。
采用此种方法获得的udid有过长的缺点,实际在使用的时候也遇到了由于udid过长导致与服务器通信时遇到些特殊问题,但是由于版本已经发出去了,无法再更改。如果可以修改的话可以使用另外一种方式,MD5,将从设备获得的byte数组求MD5,得到的序列号也几乎是唯一的。长度几乎是上述方法的一半(32)。
另外还可以做一些优化,在第一次计算得到udid的字符串后,使用独立存储存起来,以后直接读取即可,减少MD5的计算次数。