#define bit_test(x, y) ( ( ((const char*)&(x))[(y)>>3] & 0x80 >> ((y)&0x07)) >> (7-((y)&0x07) ) )
Демонстрационное использование:
int main(void)
{
unsigned char arr[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
for (int ix = 0; ix < 64; ++ix)
printf("bit %d is %d\n", ix, bit_test(arr, ix));
return 0;
}
Примечания: Это разработано, чтобы быть быстрым (учитывая его гибкость) и неразветвленным. Это приводит к эффективному машинному коду SPARC когда скомпилированный Sun Studio 8; я также протестировал его с помощью MSVC ++ 2008 на amd64. Возможно сделать подобные макросы для установки и очистки битов. Основное отличие этого решения по сравнению со многими другими здесь - то, что оно работает на любое местоположение в в значительной степени любом типе переменной.
Вот хорошее начало с WMI ...
// Win32_CPU will work too
var search = new ManagementObjectSearcher( "SELECT * FROM Win32_baseboard" );
var mobos = search.Get();
foreach (var m in mobos)
{
var serial = m["SerialNumber"]; // ProcessorID if you use Win32_CPU
}
Вы можете сделать это с множеством аппаратных средств и придумать решение.
Вы можете использовать пространство имен System.Management , чтобы получить всю информацию, относящуюся к оборудованию, идентификатору процессора, MAC-адресам и многим другим данным, которые затем можно хэшировать вместе.
Взгляните на эту статью:
http://www.codeproject.com/KB/system/GetHardwareInformation.aspx
Предполагая, что вы говорите о Windows, тогда каждая установка Windows имеет уникальный идентификатор продукта (который можно увидеть, просмотрев свойства «Мой компьютер»). Я думаю, что это хранится в HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion: ProductId (REG_SZ)
. Я так понимаю, вы хотите большего?
Вы можете изучить использование GUID
Для тех из вас, кто не знает, GUID (произносится goo'id - глобальный уникальный идентификатор ) - это 128-битное целое число, которое можно использовать для однозначной идентификации чего-либо. Вы можете хранить пользователей или продукты в своей базе данных, и вам нужно каким-то образом однозначно идентифицировать каждую строку в базе данных. Распространенным подходом является создание автоматически увеличивающегося целого числа, другим способом было бы создание GUID для ваших продуктов.
Метод GUID можно найти в пространстве имен System. Метод GUID System.Guid.NewGuid () инициализирует новый экземпляр класса GUID.
Есть также несколько перегрузок, доступных для тех из вас, кто хочет отформатировать GUID определенным образом.
Следующий живой пример выведет сгенерированный GUID, исходный код также ниже.
Response.Write(@"<br>System.Guid.NewGuid().ToString() = " + System.Guid.NewGuid().ToString());
Response.Write(@"<br>System.Guid.NewGuid().ToString(""N"") = " + System.Guid.NewGuid().ToString("N"));
Response.Write(@"<br>System.Guid.NewGuid().ToString(""D"") = " + System.Guid.NewGuid().ToString("D"));
Response.Write(@"<br>System.Guid.NewGuid().ToString(""B"") = " + System.Guid.NewGuid().ToString("B"));
Response.Write(@"<br>System.Guid.NewGuid().ToString(""P"") = " + System.Guid.NewGuid().ToString("P"));
MAC-адрес сетевой карты:
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
{
// probably need to do some filtering on ni.NetworkInterfaceType here
Console.WriteLine(ni.GetPhysicalAddress());
}
Вы можете использовать WMI с C #, чтобы получить довольно много информации об аппаратном обеспечении.
Идентификаторы жесткого диска и MAC-адрес Ethernet - это два общих уникальных идентификатора, используемых в схемах идентификации системы. Теоретически MAC-адрес уникален для каждой сетевой карты.