Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Zufallszahl erzeugen die es 100%ig nur einmal gibt, geht das?


  • Please log in to reply
20 replies to this topic
fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Hallo zusammen,

 

es geht darum einem Eintrag eine eindeutige ID zuzuweisen. Nur passiert dies bei 50 Uern unabhängig. Ich habe keine "echte DB" daher kann ich keinen ID Wert global speichern und diesen fortlaufend verwenden.

 

Daher versuche ich dies zu umgehen indem ich einen Hash berechne.

 

Hier der Code:

GetID:
TokenInput := A_NOW A_UserName
TokenI := SSMD5(TokenInput)
Return

SSMD5(data)
{
	l := MD5(data "Gda_-9")
	r := MD5("Gda_-9" data)
	return MD5(data l r "Gda_-9")
}

MD5(string){
	return HashFromString(string, 0x8003)
}

HashFromAddr(pData, len, algid, key=0){
	ptr := (A_PtrSize) ? "ptr" : "uint"
	aw := (A_IsUnicode) ? "W" : "A"
	if (DllCall("advapi32\CryptAcquireContext" aw, ptr "*", hProv, ptr, 0, ptr, 0, "uint", 1, "uint", 0xF0000000)){
		if (DllCall("advapi32\CryptCreateHash", ptr, hProv, "uint", algid, "uint", key, "uint", 0, ptr "*", hHash)){
			if (DllCall("advapi32\CryptHashData", ptr, hHash, ptr, pData, "uint", len, "uint", 0)){
				if (DllCall("advapi32\CryptGetHashParam", ptr, hHash, "uint", 2, ptr, 0, "uint*", size, "uint", 0)){
					VarSetCapacity(bhash, size, 0)
					DllCall("advapi32\CryptGetHashParam", ptr, hHash, "uint", 2, ptr, &bhash, "uint*", size, "uint", 0)
				}
			}
			DllCall("advapi32\CryptDestroyHash", ptr, hHash)
		}
		DllCall("advapi32\CryptReleaseContext", ptr, hProv, "uint", 0)
	}
	int := A_FormatInteger
	SetFormat, Integer, h
	Loop, % size
	{
		v := substr(NumGet(bhash, A_Index-1, "uchar") "", 3)
		while (strlen(v)<2)
		v := "0" v
		hash .= v
	}
	SetFormat, Integer, % int
	return hash
}

HashFromString(string, algid, key=0){
	len := strlen(string)
	if (A_IsUnicode){
		VarSetCapacity(data, len)
		StrPut := "StrPut"
		%StrPut%(string, &data, len, "cp0")
		return HashFromAddr(&data, len, algid, key)
	}
	data := string
	return HashFromAddr(&data, len, algid, key)
}

Der Code zur Hash berechnung stammt hier aus dem Forum ich weiß nur leider nicht mehr von wem er stammt.

 

Ich erzeuge also hier einen Hash aus der Var TokenInput, A_NOW ändert sich jede ms und A_UserName kommt auch immer nur einmal im Userverzeichnis vor.
TokenI := SSMD5(TokenInput) erzeugt einen Hash der 32 Zeichen lang ist. Er ist mir aber eigentlich zu lang... 16 würden vollkommen reichen.

 

Ist sowas denn einmalig genug?

Wie kann man einen kürzeren String erzeugen der zudem einmalig ist?

IST so ein String (Hash) tatsächlich einmalig?

 

Danke euch!

 

MfG

fump



strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

Wieso hast du denn keine echte DB? wink.png
Haben deine Datensätze/Tupel kein einzigartiges Merkmal? (z.b. User und timestamp) Wenn nicht, kannst du die Tupel ja vllt  ergänzen.
Ansonsten g00gle mal hash collision.
 


Regards,
Babba

SAPlayer
  • Members
  • 403 posts
  • Last active: Apr 11 2014 04:45 PM
  • Joined: 06 Nov 2012
Ein Hash kann sich wiederholen, er ist nicht einzigartig. Das wird dir auch bei anderen Hash-Methoden passieren.

Auch wenn es recht unwahrscheinlich, es ist möglich, zweimal den gleichen Hash zu generieren.

jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
der Code für den Hash stammt von Bentschi
die aktuelle Version für incl SHA-2-Klassen gibt es hier


Leg doch vorher eine shared datei (z.b. .txt, .csv) an, die keine Ahnung 100 random Einträge enthält und jedesmal wenn du ein brauchst wird die verwendete aus der
Datei gelöscht.
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Danke für eure Beiträge!

 

Ich möchte es gerne im Script lösen. Ohne irgend was anlegen zu müssen.

 

Wir würdet ihr denn sowas lösen ohne auf Externes angewiesen zu sein?

 

Nebenbei:

Wie kann ich in einem String jedes 2. Zeichen entfernen?



jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
avi hat da was nettes gezaubert
 
str = abcdefghijklmnopqrstuvwxyz
msgbox,% removexth(str, 6)		;return = abcdeghijkmnopqstuvwyz
msgbox,% removexth(str, 2)		;return = acegikmoqsuwy
msgbox,% removexth(str, 1)		;blank return
return

Removexth(str, x){
	len := Strlen(str)
	loop
	{
		tempstr .= Substr(str, x*(A_index-1)+1, x-1)
		if ( (x*A_index) > len )
			break
	}
	return, tempstr
}
oder von uname in kürzer 
str := "abcdefghijklmnopqrstuvwxyz"
MsgBox % RegExReplace(str, "s).{" 2 - 1 "}\K.")
; x := 2
; MsgBox % RegExReplace(str, "s).{" x - 1 "}\K.")

[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
Das müsste doch eindeutig genug sein
; GLOBAL SETTINGS ===================================================================

#NoEnv
#SingleInstance force

#Include Crypt.ahk
#Include CryptConst.ahk
#Include CryptFoos.ahk

; SCRIPT ============================================================================

strComputer := "."
objWMIService := ComObjGet("winmgmts:\\" . strComputer . "\root\cimv2")
colItems := objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")._NewEnum
while colItems[objItem]
MACAddress := objItem.MACAddress	;MACAddress holen

strToHash := A_NOW A_UserName		;String für Hash
strToHMAC := % MACAddress		;String für HMAC (oben ermittelte MACAddress)

crypt := Crypt.Hash.StrHash( strToHash, 1, strToHMAC, 7 )	;String Hashen und mit HMAC verschlüsseln

MsgBox, % RegExReplace(crypt, "s).{" 2 - 1 "}\K.")		;Den gehashten Wert auf 16 Stellen verkürzen (1,3,5,7...)

; EXIT ==============================================================================
Und zum Thema Kollision zu Hash siehe hier
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Hi!

 

Danke für deinen Code,

 

ich habe 7000 ID's erzeugt, keine doppelte vorhanden. Ich weiß nicht ob das aussagekräftig genug ist?



jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
http://www.linus-neu...hashfunktionen/
Zitat:
Gehen wir aber mal davon aus, unsere Hashfunktion sei ideal und habe einen Ergebnisraum von 128bit (wie zum Beispiel md5). Wenn sie also alle oben genannten Anforderungen erfüllt, dann kann sie genau
nhashes = 2^128 = 3.4 × 10^38
unterschiedliche Dateien abbilden und ich habe – beim Raten – eine Wahrscheinlichkeit von
pkollision = 1/(2^128) = 2.9 × 10^-39
mit der ich eine kollidierende Datei finde.
Dadurch, dass wir die 32 auf 16 Stellen gekürzt haben ist die Wahrscheinlichkeit nicht ganz so hoch.
Aber für den normalen Gebrauch ausreichend =)
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ja in eurem Fall könnten maximal 2^(16*4)=64bit=2^64 Hashes enstehen ohne irgend eine Kollision.

Es würde aber theoretisch schon 1 byte ausreichen.


Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Die 7000 ID's hatte ich mit der alten funktion erzeugt, bei 200.000 gibt es allerdings nen haufen doppelte.

 

Nun wollte ich deine Versuchen, die funktioniert aber nicht mehrmals.

Ich setz es in einen Loop aber crypt hat nur beim 1. mal einen Wert. Danach ist crypt immer Leer.

 

Warum? Ich sehe den Grund nicht :(



fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Finde den Fehler leider nicht. Warum ist crypt nach dem 1. mal immer leer?



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Wie definiert sich denn objItem ?


Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

strToHash und strToHMAC haben immer ihren Wert. Den Wert von crypt bekomm ich aber nur einmal, danach ist crypt immer leer.

 

Wie sich objItem definiert weiß ich leider nicht.



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Wie sich objItem definiert weiß ich leider nicht . 

Nun ja die Antwort ist gar nicht. grin.png
Ich hab es durchgeprüft ObjItem hat keinen Inhalt.
Du musst einen For Loop benutzen in dem Fall.

Visit the new forum ahkscript.org.

http://ahkscript.org