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"");
}
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
Aktualisieren Sie zuerst Ihren Compiler als Comeback hier. Dieser Compiler ist fehlerhaft und nicht kompatibel mit modernen Features, die Thread-sicher sind. Gehen! – Joel
@ 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