2016-04-11 3 views
0

Допустим, у нас есть строкаGUID из строки

"{GUID}"

, где GUID является стандартным GUID в {}. Мне нужно получить переменную типа GUID, соответствующую данной строке. Это должно быть сделано с визуальным C++, и версия очень старая (6.0), если это имеет значение.

Во-первых, я попытался использовать функцию GUIDFromString, но не смог ее импортировать, так что узнал о UuidFromString. Но я действительно застрял во всех этих отбрасываниях от unsigned char до char и т. Д., Не имея фона на C++, это очень сложно. Может быть, кто-то будет так добр, чтобы помочь мне в этом. Благодарю.

+0

Хотя я почти ничего не знаю о программировании Windows, [Raymond Chen написал об этом недавно] (https://blogs.msdn.microsoft.com/oldnewthing/20160331-00/?p=93231). – BoBTFish

+0

Сначала обновите свой компилятор, чем вернитесь сюда. Этот компилятор неисправен и несовместим с современными функциями, которые являются потокобезопасными. Идти! – Joel

+0

@ Joel2 Вы действительно думаете, что я не знаю о новых версиях компилятора? Если бы обновление было вариантом, я бы сделал это, но это не так.Обсуждать причины было бы очень не по теме, но в целом я имею дело с наследием проекта, где я должен изменить очень мало вещей, поэтому приведение его к совместимости с текущим ВС потребует много времени и опыта. – Gonzalez

ответ

1

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""); 

} 
1

Хорошо, проблема была в включать и LIBS. Вам нужно включить <Rpc.h> и связать библиотеку RPC:

#pragma comment (lib, "Rpcrt4.lib") 

И чем вы можете использовать UuidFromString функцию. Просто отметьте, что вам не нужно включать {и} в строковое представление.

Смежные вопросы