GUID относится к уникальному идентификационному номеру, который может быть сгенерирован с использованием некоторого алгоритма - вы можете найти несколько описаний по алгоритмам Microsoft - там, где они пытаются подобрать временную метку, номер сетевой карты и один, и смешать в один уникальный GUID.
Что я проверил - никто не мешает вам создать свой собственный «уникальный» алгоритм генерации, но вам нужно как-то убедиться, что ваш уникальный алгоритм генерации не столкнется с существующими алгоритмами, что маловероятно. Также GUID, созданный вашим алгоритмом, также не должен сталкиваться с вашим собственным GUID.
При просмотре Интернета я нашел несколько подходов для создания такого GUID - например - Microsoft Office: http://support.microsoft.com/kb/2186281
При генерации GUID из строк, вы можете использовать либо String.GetHashCode32 или даже вычислить, например, 20 байт sha- 1 хэш над строкой. (Первый из них проще, но второй создает больше байтов для использования для GUID).
И затем начните заполнять GUID, насколько это требуется.
Вот некоторые демо-код, который давайте вы получите идею:
using System;
class Program
{
/// <summary>
/// http://stackoverflow.com/questions/53086/can-i-depend-on-the-values-of-gethashcode-to-be-consistent
///
/// Similar to String.GetHashCode but returns the same as the x86 version of String.GetHashCode for x64 and x86 frameworks.
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static unsafe int GetHashCode32(string s)
{
fixed (char* str = s.ToCharArray())
{
char* chPtr = str;
int num = 0x15051505;
int num2 = num;
int* numPtr = (int*)chPtr;
for (int i = s.Length; i > 0; i -= 4)
{
num = (((num << 5) + num) + (num >> 0x1b))^numPtr[0];
if (i <= 2)
{
break;
}
num2 = (((num2 << 5) + num2) + (num2 >> 0x1b))^numPtr[1];
numPtr += 2;
}
return (num + (num2 * 0x5d588b65));
}
}
/// <summary>
/// Generates new product code for particular product/install package.
/// </summary>
/// <param name="productName">Logical product name for which to generate</param>
/// <param name="productVersion">Product version in form "1.0.0"</param>
/// <returns></returns>
static public String GenerateProductCode(String productName, String productVersion)
{
String[] vparts = productVersion.Split(".".ToCharArray());
int[] verParts = new int [3] { 1, 0, 0 };
int i = 0;
foreach(String v in vparts)
{
Int32.TryParse(v, out verParts[i++]);
if(i >= 3) break;
}
//
// "MyCompanyName", "1.0.2" will generate guid like this: {F974DC1F-0001-0000-0002-10009CD45A98}
// ^Hash over manufacturer name - "MyCompanyName"
// ^Version - "<major>-<minor>-<build>" in hexadecimal
// ^1 as for 64 bit.
// ^000 - just reserved for future needs
// ^Hash over product name
//
// See also similar generation schemes - http://support.microsoft.com/kb/2186281.
//
String newGuid = String.Format("{0:X8}-{1:X4}-{2:X4}-{3:X4}-1000{4:X8}", GetHashCode32("MyCompanyName"), verParts[0], verParts[1], verParts[2], GetHashCode32(productName));
newGuid = "{" + newGuid + "}";
return newGuid;
}
static void Main()
{
String s = GenerateProductCode("MyProduct", "1.0.2");
Console.WriteLine(s);
}
}
напечатает:
{F974DC1F-0001-0000-0002-10003618D1E1}
Но подобным же образом вы можете создать GUIDs в C++, а также - использование Sprintf() скорее всего.
Здесь функция .NET совместимый для преобразования строки в хэш-код:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int GetHashCode32(const wchar_t* ps)
{
int num = 0x15051505;
int num2 = num;
const wchar_t* s = ps;
const char* chPtr=(const char*) ps;
size_t numBuff = wcslen((wchar_t*) chPtr) * 2;
int* numPtr = (int*)chPtr;
for (int i = wcslen(s); i > 0; i -= 4)
{
num = (((num << 5) + num) + (num >> 0x1b))^numPtr[0];
if (i <= 2)
{
break;
}
num2 = (((num2 << 5) + num2) + (num2 >> 0x1b))^numPtr[1];
numPtr += 2;
}
return (num + (num2 * 0x5d588b65));
}
void GetHash(const wchar_t* p)
{
printf("'%S' = %08X", p, GetHashCode32(p));
printf("\r\n");
}
void main(void)
{
GetHash(L"testing");
GetHash(L"MainClass::" __FUNCTIONW__);
GetHash(L"1");
GetHash(L"");
}
Хотя я почти ничего не знаю о программировании Windows, [Raymond Chen написал об этом недавно] (https://blogs.msdn.microsoft.com/oldnewthing/20160331-00/?p=93231). – BoBTFish
Сначала обновите свой компилятор, чем вернитесь сюда. Этот компилятор неисправен и несовместим с современными функциями, которые являются потокобезопасными. Идти! – Joel
@ Joel2 Вы действительно думаете, что я не знаю о новых версиях компилятора? Если бы обновление было вариантом, я бы сделал это, но это не так.Обсуждать причины было бы очень не по теме, но в целом я имею дело с наследием проекта, где я должен изменить очень мало вещей, поэтому приведение его к совместимости с текущим ВС потребует много времени и опыта. – Gonzalez