Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

use murmur hash for class name hashing #1240

Open
wants to merge 23 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
7c4beab
add murmurhash implementation
apolyakov Feb 19, 2025
9309d84
fix copyright year
apolyakov Feb 20, 2025
1d71664
replace static const variable with static constexpr
apolyakov Feb 21, 2025
9216689
mark some functions noexcept
apolyakov Feb 24, 2025
7822699
rename hashes.cpp -> murmur-hash.cpp and change license
apolyakov Feb 25, 2025
a639e4a
mark murmur_hash functions constexpr
apolyakov Feb 25, 2025
321975e
use vk::murmur_hash instead of vk::std_hash in class name hash comput…
apolyakov Feb 20, 2025
42d08ed
fix build errors
apolyakov Feb 20, 2025
7ff862d
rebase on updated apolyakov/add-murmurhash3
apolyakov Feb 25, 2025
1c894ec
get rid of predefined magic constant hashes in get_hash
apolyakov Feb 25, 2025
e4a29ed
make ComponentQuery class final
apolyakov Feb 25, 2025
c80ab2b
mark KphpRpcRequestsExtraInfo's get_class and get_hash constexpr
apolyakov Feb 25, 2025
66abcbb
change return type ClassData::get_hash to int32_t
apolyakov Feb 25, 2025
193de79
add default init to KphpJobWorkerResponseError::error_code
apolyakov Feb 25, 2025
e6df744
mark some classes defined in the runtime final
apolyakov Feb 25, 2025
909abd8
fix static/dynamic nature of get_hash and get_class methods
apolyakov Feb 25, 2025
38ed885
Revert "mark murmur_hash functions constexpr"
apolyakov Feb 25, 2025
ca2028a
fix builtin classes' inheritance
apolyakov Feb 25, 2025
bc841d9
non functional changes
apolyakov Feb 25, 2025
b1bc1ce
fix inheritance for some builtin classes
apolyakov Feb 26, 2025
d520c8d
use proper base classes for builtin interfaces in k2 runtime
apolyakov Feb 26, 2025
7b9b393
remove unnecessary diff
apolyakov Feb 27, 2025
2ef387e
replace tabs with spaces in cmake
apolyakov Feb 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion builtin-functions/kphp-light/functions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ function sched_yield_sleep($duration ::: float) ::: void;

// === Component ==================================================================================

class ComponentQuery {
final class ComponentQuery {
private function __construct() ::: \ComponentQuery;
}

Expand Down
4 changes: 3 additions & 1 deletion cmake/popular-common.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
include_guard(GLOBAL)

set(LIGHT_COMMON_SOURCES crc32_generic.cpp md5.cpp algorithms/simd-int-to-string.cpp)
set(LIGHT_COMMON_SOURCES
crc32_generic.cpp md5.cpp algorithms/simd-int-to-string.cpp
algorithms/murmur-hash.cpp)

if(COMPILE_RUNTIME_LIGHT)
set(COMMON_SOURCES_FOR_COMP "${LIGHT_COMMON_SOURCES}")
Expand Down
1 change: 1 addition & 0 deletions common/common.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ prepend(COMMON_MAIN_SOURCES ${COMMON_DIR}/

sha1.cpp
allocators/freelist.cpp
algorithms/murmur-hash.cpp
md5.cpp
allocators/lockfree-slab.cpp
server/main-binlog.cpp
Expand Down
1 change: 1 addition & 0 deletions compiler/compiler.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ endif()

prepend(KPHP_COMPILER_COMMON ${COMMON_DIR}/
dl-utils-lite.cpp
algorithms/murmur-hash.cpp
wrappers/fmt_format.cpp
termformat/termformat.cpp
tl2php/combinator-to-php.cpp
Expand Down
7 changes: 4 additions & 3 deletions compiler/data/class-data.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
// Distributed under the GPL v3 License, see LICENSE.notice.txt

#pragma once

#include <atomic>
#include <cstdint>
#include <forward_list>

#include "common/algorithms/compare.h"
#include "common/algorithms/hashes.h"

#include "compiler/data/class-members.h"
#include "compiler/data/class-modifiers.h"
#include "compiler/debug.h"
Expand Down Expand Up @@ -174,8 +175,8 @@ class ClassData : public Lockable {

void debugPrint();

int get_hash() const {
return static_cast<int>(vk::std_hash(name));
int32_t get_hash() const {
return static_cast<int32_t>(vk::murmur_hash<uint32_t>(name.data(), name.size()));
}

std::string get_subdir() const {
Expand Down
4 changes: 3 additions & 1 deletion runtime-light/stdlib/component/component-api.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <string_view>
#include <utility>

#include "common/algorithms/hashes.h"
#include "runtime-common/core/class-instance/refcountable-php-classes.h"
#include "runtime-common/core/runtime-core.h"
#include "runtime-light/coroutine/task.h"
Expand All @@ -33,7 +34,8 @@ struct C$ComponentQuery final : public refcountable_php_classes<C$ComponentQuery
}

constexpr int32_t get_hash() const noexcept {
return static_cast<int32_t>(std::hash<std::string_view>{}(get_class()));
std::string_view name_view{C$ComponentQuery::get_class()};
return static_cast<int32_t>(vk::murmur_hash<uint32_t>(name_view.data(), name_view.size()));
}

~C$ComponentQuery() {
Expand Down
14 changes: 8 additions & 6 deletions runtime-light/stdlib/job-worker/job-worker.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <cstring>
#include <string_view>

#include "common/algorithms/hashes.h"
#include "runtime-common/core/class-instance/refcountable-php-classes.h"
#include "runtime-common/core/runtime-core.h"

Expand All @@ -19,7 +20,7 @@ namespace job_worker_impl_ {

class ToArrayVisitor;

struct SendableBase : virtual abstract_refcountable_php_interface {
struct SendableBase : refcountable_polymorphic_php_classes_virt<> {

virtual void accept(ToArrayVisitor & /*unused*/) noexcept {}

Expand Down Expand Up @@ -58,16 +59,17 @@ struct C$KphpJobWorkerResponse : public job_worker_impl_::SendableBase {

// === KphpJobWorkerResponseError =================================================================

struct C$KphpJobWorkerResponseError : public refcountable_polymorphic_php_classes<C$KphpJobWorkerResponse> {
struct C$KphpJobWorkerResponseError : public C$KphpJobWorkerResponse {
string error;
int64_t error_code;
int64_t error_code{};

const char *get_class() const noexcept override {
return "KphpJobWorkerResponseError";
}

int32_t get_hash() const noexcept override {
return static_cast<int32_t>(std::hash<std::string_view>{}(get_class()));
std::string_view name_view{C$KphpJobWorkerResponseError::get_class()};
return static_cast<int32_t>(vk::murmur_hash<uint32_t>(name_view.data(), name_view.size()));
}

size_t virtual_builtin_sizeof() const noexcept override {
Expand All @@ -83,10 +85,10 @@ inline class_instance<C$KphpJobWorkerResponseError> f$KphpJobWorkerResponseError
return v$this;
}

inline string f$KphpJobWorkerResponseError$$getError(class_instance<C$KphpJobWorkerResponseError> v$this) noexcept {
inline string f$KphpJobWorkerResponseError$$getError(const class_instance<C$KphpJobWorkerResponseError> &v$this) noexcept {
return v$this.get()->error;
}

inline int64_t f$KphpJobWorkerResponseError$$getErrorCode(class_instance<C$KphpJobWorkerResponseError> v$this) noexcept {
inline int64_t f$KphpJobWorkerResponseError$$getErrorCode(const class_instance<C$KphpJobWorkerResponseError> &v$this) noexcept {
return v$this.get()->error_code;
}
17 changes: 3 additions & 14 deletions runtime-light/stdlib/rpc/rpc-extra-info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,10 @@

#include "runtime-light/stdlib/rpc/rpc-extra-info.h"

#include "common/algorithms/hashes.h"
#include "common/wrappers/string_view.h"
#include "runtime-light/stdlib/rpc/rpc-state.h"

const char *C$KphpRpcRequestsExtraInfo::get_class() const noexcept {
return R"(KphpRpcRequestsExtraInfo)";
}
#include <cstdint>
#include <tuple>

int C$KphpRpcRequestsExtraInfo::get_hash() const noexcept {
return static_cast<int32_t>(vk::std_hash(vk::string_view(C$KphpRpcRequestsExtraInfo::get_class())));
}

array<rpc_request_extra_info_t> f$KphpRpcRequestsExtraInfo$$get(class_instance<C$KphpRpcRequestsExtraInfo> v$this) noexcept {
return v$this.get()->extra_info_arr;
}
#include "runtime-light/stdlib/rpc/rpc-state.h"

Optional<rpc_response_extra_info_t> f$extract_kphp_rpc_response_extra_info(int64_t query_id) noexcept {
auto &extra_info_map{RpcInstanceState::get().rpc_responses_extra_info};
Expand Down
17 changes: 14 additions & 3 deletions runtime-light/stdlib/rpc/rpc-extra-info.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
#pragma once

#include <cstdint>
#include <string_view>
#include <tuple>

#include "common/algorithms/hashes.h"
#include "runtime-common/core/class-instance/refcountable-php-classes.h"
#include "runtime-common/core/runtime-core.h"
#include "runtime-common/stdlib/visitors/dummy-visitor-methods.h"
Expand All @@ -21,10 +23,19 @@ struct C$KphpRpcRequestsExtraInfo final : public refcountable_php_classes<C$Kphp
array<rpc_request_extra_info_t> extra_info_arr;

C$KphpRpcRequestsExtraInfo() = default;
const char *get_class() const noexcept;
int get_hash() const noexcept;

constexpr const char *get_class() const noexcept {
return R"(KphpRpcRequestsExtraInfo)";
}

constexpr int32_t get_hash() const noexcept {
std::string_view name_view{C$KphpRpcRequestsExtraInfo::get_class()};
return static_cast<int32_t>(vk::murmur_hash<uint32_t>(name_view.data(), name_view.size()));
}
};

array<rpc_request_extra_info_t> f$KphpRpcRequestsExtraInfo$$get(class_instance<C$KphpRpcRequestsExtraInfo> v$this) noexcept;
inline array<rpc_request_extra_info_t> f$KphpRpcRequestsExtraInfo$$get(const class_instance<C$KphpRpcRequestsExtraInfo> &v$this) noexcept {
return v$this.get()->extra_info_arr;
}

Optional<rpc_response_extra_info_t> f$extract_kphp_rpc_response_extra_info(int64_t query_id) noexcept;
61 changes: 33 additions & 28 deletions runtime-light/stdlib/rpc/rpc-tl-function.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
#pragma once

#include <cstdint>
#include <string_view>

#include "common/algorithms/hashes.h"
#include "common/wrappers/string_view.h"
#include "runtime-common/core/class-instance/refcountable-php-classes.h"
#include "runtime-common/core/runtime-core.h"

struct tl_func_base;

Expand All @@ -23,19 +24,21 @@ class InstanceDeepDestroyVisitor;
// C$VK$TL$... should match that layout

// this interface is implemented by all PHP classes that represent the TL functions (see tl-to-php)
struct C$VK$TL$RpcFunction : abstract_refcountable_php_interface {
virtual const char *get_class() const {
struct C$VK$TL$RpcFunction : refcountable_polymorphic_php_classes_virt<> {
virtual const char *get_class() const noexcept {
return "VK\\TL\\RpcFunction";
}
virtual int32_t get_hash() const {
return static_cast<int32_t>(vk::std_hash(vk::string_view(C$VK$TL$RpcFunction::get_class())));

virtual int32_t get_hash() const noexcept {
std::string_view name_view{C$VK$TL$RpcFunction::get_class()};
return static_cast<int32_t>(vk::murmur_hash<uint32_t>(name_view.data(), name_view.size()));
}

virtual void accept(ToArrayVisitor &) noexcept {}
virtual void accept(CommonMemoryEstimateVisitor &) noexcept {}
virtual void accept(InstanceReferencesCountingVisitor &) noexcept {}
virtual void accept(InstanceDeepCopyVisitor &) noexcept {}
virtual void accept(InstanceDeepDestroyVisitor &) noexcept {}
virtual void accept(ToArrayVisitor & /*unused*/) noexcept {}
virtual void accept(CommonMemoryEstimateVisitor & /*unused*/) noexcept {}
virtual void accept(InstanceReferencesCountingVisitor & /*unused*/) noexcept {}
virtual void accept(InstanceDeepCopyVisitor & /*unused*/) noexcept {}
virtual void accept(InstanceDeepDestroyVisitor & /*unused*/) noexcept {}

virtual size_t virtual_builtin_sizeof() const noexcept {
return 0;
Expand All @@ -50,19 +53,20 @@ struct C$VK$TL$RpcFunction : abstract_refcountable_php_interface {

// every TL function has a class for the result that implements RpcFunctionReturnResult;
// which has ->value of the required type
struct C$VK$TL$RpcFunctionReturnResult : abstract_refcountable_php_interface {
virtual const char *get_class() const {
struct C$VK$TL$RpcFunctionReturnResult : refcountable_polymorphic_php_classes_virt<> {
virtual const char *get_class() const noexcept {
return "VK\\TL\\RpcFunctionReturnResult";
}
virtual int32_t get_hash() const {
return static_cast<int32_t>(vk::std_hash(vk::string_view(C$VK$TL$RpcFunctionReturnResult::get_class())));
virtual int32_t get_hash() const noexcept {
std::string_view name_view{C$VK$TL$RpcFunctionReturnResult::get_class()};
return static_cast<int32_t>(vk::murmur_hash<uint32_t>(name_view.data(), name_view.size()));
}

virtual void accept(ToArrayVisitor &) noexcept {}
virtual void accept(CommonMemoryEstimateVisitor &) noexcept {}
virtual void accept(InstanceReferencesCountingVisitor &) noexcept {}
virtual void accept(InstanceDeepCopyVisitor &) noexcept {}
virtual void accept(InstanceDeepDestroyVisitor &) noexcept {}
virtual void accept(ToArrayVisitor & /*unused*/) noexcept {}
virtual void accept(CommonMemoryEstimateVisitor & /*unused*/) noexcept {}
virtual void accept(InstanceReferencesCountingVisitor & /*unused*/) noexcept {}
virtual void accept(InstanceDeepCopyVisitor & /*unused*/) noexcept {}
virtual void accept(InstanceDeepDestroyVisitor & /*unused*/) noexcept {}

virtual size_t virtual_builtin_sizeof() const noexcept {
return 0;
Expand All @@ -76,20 +80,21 @@ struct C$VK$TL$RpcFunctionReturnResult : abstract_refcountable_php_interface {

// function call response — ReqResult from the TL scheme — is a rpcResponseOk|rpcResponseHeader|rpcResponseError;
// if it's rpcResponseOk or rpcResponseHeader, then their bodies can be retrieved by a fetcher that was returned by a store
struct C$VK$TL$RpcResponse : abstract_refcountable_php_interface {
struct C$VK$TL$RpcResponse : refcountable_polymorphic_php_classes_virt<> {
using X = class_instance<C$VK$TL$RpcFunctionReturnResult>;

virtual void accept(ToArrayVisitor &) noexcept {}
virtual void accept(CommonMemoryEstimateVisitor &) noexcept {}
virtual void accept(InstanceReferencesCountingVisitor &) noexcept {}
virtual void accept(InstanceDeepCopyVisitor &) noexcept {}
virtual void accept(InstanceDeepDestroyVisitor &) noexcept {}
virtual void accept(ToArrayVisitor & /*unused*/) noexcept {}
virtual void accept(CommonMemoryEstimateVisitor & /*unused*/) noexcept {}
virtual void accept(InstanceReferencesCountingVisitor & /*unused*/) noexcept {}
virtual void accept(InstanceDeepCopyVisitor & /*unused*/) noexcept {}
virtual void accept(InstanceDeepDestroyVisitor & /*unused*/) noexcept {}

virtual const char *get_class() const {
virtual const char *get_class() const noexcept {
return "VK\\TL\\RpcResponse";
}
virtual int32_t get_hash() const {
return static_cast<int32_t>(vk::std_hash(vk::string_view(C$VK$TL$RpcResponse::get_class())));
virtual int32_t get_hash() const noexcept {
std::string_view name_view{C$VK$TL$RpcResponse::get_class()};
return static_cast<int32_t>(vk::murmur_hash<uint32_t>(name_view.data(), name_view.size()));
}

virtual size_t virtual_builtin_sizeof() const noexcept {
Expand Down
15 changes: 10 additions & 5 deletions runtime/datetime/date_interval.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,29 @@

#pragma once

#include <cstdint>
#include <string_view>

#include "common/algorithms/hashes.h"
#include "runtime-common/core/class-instance/refcountable-php-classes.h"
#include "runtime-common/stdlib/visitors/dummy-visitor-methods.h"
#include "runtime/datetime/timelib_wrapper.h"

struct C$DateInterval: public refcountable_php_classes<C$DateInterval>, private DummyVisitorMethods {
struct C$DateInterval : public refcountable_polymorphic_php_classes_virt<>, private DummyVisitorMethods {
using DummyVisitorMethods::accept;

timelib_rel_time *rel_time{nullptr};

const char *get_class() const noexcept {
virtual const char *get_class() const noexcept {
return R"(DateInterval)";
}

int get_hash() const noexcept {
return -393296726;
virtual int32_t get_hash() const noexcept {
std::string_view name_view{C$DateInterval::get_class()};
return static_cast<int32_t>(vk::murmur_hash<uint32_t>(name_view.data(), name_view.size()));
}

~C$DateInterval();
~C$DateInterval() override;
};

class_instance<C$DateInterval> f$DateInterval$$__construct(const class_instance<C$DateInterval> &self, const string &duration) noexcept;
Expand Down
16 changes: 10 additions & 6 deletions runtime/datetime/datetime.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

#pragma once

#include "runtime-common/core/class-instance/refcountable-php-classes.h"
#include <cstdint>
#include <string_view>

#include "common/algorithms/hashes.h"
#include "runtime-common/core/runtime-core.h"
#include "runtime-common/stdlib/visitors/dummy-visitor-methods.h"
#include "runtime/datetime/datetime_interface.h"
Expand All @@ -13,18 +16,19 @@
struct C$DateInterval;
struct C$DateTimeImmutable;

struct C$DateTime : public refcountable_polymorphic_php_classes<C$DateTimeInterface>, private DummyVisitorMethods {
struct C$DateTime : public C$DateTimeInterface, private DummyVisitorMethods {
using DummyVisitorMethods::accept;

const char *get_class() const noexcept final {
const char *get_class() const noexcept override {
return R"(DateTime)";
}

int get_hash() const noexcept final {
return 2141635158;
int32_t get_hash() const noexcept override {
std::string_view name_view{C$DateTime::get_class()};
return static_cast<int32_t>(vk::murmur_hash<uint32_t>(name_view.data(), name_view.size()));
}

~C$DateTime();
~C$DateTime() override;
};

extern const string NOW;
Expand Down
Loading
Loading