2016-04-11 9 views
0

Lassen Sie uns sagen, dass wir einen StringGUID aus string

"{GUID}" haben

wobei GUID ist eine Standard-GUID in {}. Ich brauche eine Variable vom Typ GUID, die der angegebenen Zeichenfolge entspricht. Es ist mit Visual C++ zu machen und die Version ist sehr alt (6.0), wenn das wichtig ist.

Erstens habe ich versucht, GUIDFromString Funktion zu verwenden, aber war nicht in der Lage, es zu importieren, so erfuhr über UuidFromString. Aber ich bin wirklich fest an all diesen Umwandlungen von unsigned char char usw., ohne C++ Hintergrund ist es sehr schwer. Vielleicht wird jemand so freundlich sein, mir dabei zu helfen. Vielen Dank.

+0

Während ich fast nichts über Windows-Programmierung weiß, [Raymond Chen schrieb kürzlich darüber] (https://blogs.msdn.microsoft.com/oldnewthing/20160331-00/?p=93231). – BoBTFish

+0

Aktualisieren Sie zuerst Ihren Compiler als Comeback hier. Dieser Compiler ist fehlerhaft und nicht kompatibel mit modernen Features, die Thread-sicher sind. Gehen! – Joel

+0

@ Joel2 Glaubst du wirklich, ich weiß nichts über die neuen Versionen des Compilers? Wenn das Upgrade eine Option wäre, würde ich es tun, aber das ist es nicht.Die Diskussion von Gründen wäre ein off-topic, aber im Allgemeinen beschäftige ich mich mit einem Legacy-Projekt, in dem ich sehr wenige Dinge ändern sollte, so dass es viel Zeit und Fachwissen erfordern würde, es mit dem aktuellen VS kompatibel zu machen. – Gonzalez

Antwort

1

GUID bezieht sich auf eine eindeutige Identifikationsnummer, die mit Hilfe eines Algorithmus generiert werden kann - Sie können einige Beschreibungen zu Microsofts Algorithmen finden - wo sie versuchen, Zeitstempel, Netzwerkkartennummer und eins einzugeben und in einem zu mischen eindeutige GUID.

Was ich überprüft habe - niemand hält dich davon ab, deinen eigenen "einzigartigen" Generierungsalgorithmus zu erstellen - aber du musst irgendwie sicherstellen, dass dein einzigartiger Generierungsalgorithmus nicht mit existierenden Algorithmen kollidiert, was sehr unwahrscheinlich ist. Auch GUIDs, die von Ihrem Algorithmus generiert werden, sollten nicht mit Ihren eigenen GUIDs kollidieren.

Während Internet-Surfen Ich habe einige Ansätze gefunden solche guid erzeugen - zum Beispiel - Microsoft Office: http://support.microsoft.com/kb/2186281

Wenn GUID von Strings zu erzeugen, können Sie entweder String.GetHashCode32 oder auch zum Beispiel 20 Byte SHA verwenden berechnen 1 Hash über die Zeichenfolge. (Die erste ist einfacher, aber die zweite erstellt mehr Bytes für die GUID).

Und dann beginnen, GUID zu füllen, so viel wie es benötigt wird.

Hier finden Sie einige Demo-Code, die Sie auf die Idee kommen lassen:

Wird auszudrucken
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} 

aber in ähnlicher Weise können Sie GUIDs in C++ generieren sowie - Nutzung sprintf() höchstwahrscheinlich.

Hier .NET kompatible Funktion für String in Hashcode Umwandlung:

#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

Okay, das Problem war in beinhalten und libs. Sie müssen <Rpc.h> und verknüpfen Sie die RPC-Bibliothek enthalten:

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

Und als Sie UuidFromString Funktion nutzen zu können. Beachten Sie, dass Sie {und} nicht in Ihre Zeichenfolgendarstellung aufnehmen müssen.