mirror of
https://github.com/godotengine/godot.git
synced 2024-10-23 13:41:43 +00:00
[ResourceUID] Use CryptoCore::RandomGenerator for IDs.
This commit is contained in:
parent
ee7b67e135
commit
f72bd67068
|
@ -31,7 +31,7 @@
|
||||||
#include "resource_uid.h"
|
#include "resource_uid.h"
|
||||||
|
|
||||||
#include "core/config/project_settings.h"
|
#include "core/config/project_settings.h"
|
||||||
#include "core/crypto/crypto.h"
|
#include "core/crypto/crypto_core.h"
|
||||||
#include "core/io/dir_access.h"
|
#include "core/io/dir_access.h"
|
||||||
#include "core/io/file_access.h"
|
#include "core/io/file_access.h"
|
||||||
|
|
||||||
|
@ -82,20 +82,14 @@ ResourceUID::ID ResourceUID::text_to_id(const String &p_text) const {
|
||||||
return ID(uid & 0x7FFFFFFFFFFFFFFF);
|
return ID(uid & 0x7FFFFFFFFFFFFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResourceUID::ID ResourceUID::create_id() const {
|
ResourceUID::ID ResourceUID::create_id() {
|
||||||
mutex.lock();
|
|
||||||
if (crypto.is_null()) {
|
|
||||||
crypto = Ref<Crypto>(Crypto::create());
|
|
||||||
}
|
|
||||||
mutex.unlock();
|
|
||||||
while (true) {
|
while (true) {
|
||||||
PackedByteArray bytes = crypto->generate_random_bytes(8);
|
ID id = INVALID_ID;
|
||||||
ERR_FAIL_COND_V(bytes.size() != 8, INVALID_ID);
|
MutexLock lock(mutex);
|
||||||
const uint64_t *ptr64 = (const uint64_t *)bytes.ptr();
|
Error err = ((CryptoCore::RandomGenerator *)crypto)->get_random_bytes((uint8_t *)&id, sizeof(id));
|
||||||
ID id = int64_t((*ptr64) & 0x7FFFFFFFFFFFFFFF);
|
ERR_FAIL_COND_V(err != OK, INVALID_ID);
|
||||||
mutex.lock();
|
id &= 0x7FFFFFFFFFFFFFFF;
|
||||||
bool exists = unique_ids.has(id);
|
bool exists = unique_ids.has(id);
|
||||||
mutex.unlock();
|
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
@ -261,6 +255,9 @@ ResourceUID *ResourceUID::singleton = nullptr;
|
||||||
ResourceUID::ResourceUID() {
|
ResourceUID::ResourceUID() {
|
||||||
ERR_FAIL_COND(singleton != nullptr);
|
ERR_FAIL_COND(singleton != nullptr);
|
||||||
singleton = this;
|
singleton = this;
|
||||||
|
crypto = memnew(CryptoCore::RandomGenerator);
|
||||||
|
((CryptoCore::RandomGenerator *)crypto)->init();
|
||||||
}
|
}
|
||||||
ResourceUID::~ResourceUID() {
|
ResourceUID::~ResourceUID() {
|
||||||
|
memdelete((CryptoCore::RandomGenerator *)crypto);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
#include "core/string/string_name.h"
|
#include "core/string/string_name.h"
|
||||||
#include "core/templates/ordered_hash_map.h"
|
#include "core/templates/ordered_hash_map.h"
|
||||||
|
|
||||||
class Crypto;
|
|
||||||
class ResourceUID : public Object {
|
class ResourceUID : public Object {
|
||||||
GDCLASS(ResourceUID, Object)
|
GDCLASS(ResourceUID, Object)
|
||||||
public:
|
public:
|
||||||
|
@ -47,7 +46,7 @@ public:
|
||||||
static String get_cache_file();
|
static String get_cache_file();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable Ref<Crypto> crypto;
|
void *crypto; // CryptoCore::RandomGenerator (avoid including crypto_core.h)
|
||||||
Mutex mutex;
|
Mutex mutex;
|
||||||
struct Cache {
|
struct Cache {
|
||||||
CharString cs;
|
CharString cs;
|
||||||
|
@ -67,7 +66,7 @@ public:
|
||||||
String id_to_text(ID p_id) const;
|
String id_to_text(ID p_id) const;
|
||||||
ID text_to_id(const String &p_text) const;
|
ID text_to_id(const String &p_text) const;
|
||||||
|
|
||||||
ID create_id() const;
|
ID create_id();
|
||||||
bool has_id(ID p_id) const;
|
bool has_id(ID p_id) const;
|
||||||
void add_id(ID p_id, const String &p_path);
|
void add_id(ID p_id, const String &p_path);
|
||||||
void set_id(ID p_id, const String &p_path);
|
void set_id(ID p_id, const String &p_path);
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
<description>
|
<description>
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="create_id" qualifiers="const">
|
<method name="create_id">
|
||||||
<return type="int" />
|
<return type="int" />
|
||||||
<description>
|
<description>
|
||||||
</description>
|
</description>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user