structs के लिए जहां समानता का अर्थ है प्रत्येक डेटा सदस्य के समान रूप से व्युत्पन्न प्रकार और बाइट समानता, जब कभी भी, संरचना सुरक्षित रूप से बाइट्स की सरणी के रूप में धोया जा सकता है?एक संरचना को बाइट्स की सरणी के रूप में सुरक्षित रूप से कब रखा जा सकता है?
इस दस्तावेज़
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3333.html
शीर्षक "बाइट एरेस वस्तुओं Hashing" के तहत पता चलता है कि किसी भी गद्दी के साथ structs सुरक्षित रूप से बाइट्स की एक सरणी के रूप में टुकड़ों में बांटा नहीं जा सकता है।
बाइट्स की सरणी के रूप में सुरक्षित रूप से हैश को संरक्षित करने के लिए आवश्यक पैडिंग के लिए एक स्पष्ट परीक्षण है? क्या यह पर्याप्त है?
यदि ऐसा है, तो क्या निम्न स्केच उचित रूप से उस परीक्षण को चित्रित करता है?
#include <cstddef>
#include <iostream>
struct A
{
int i;
float f;
char c;
};
// hashing would start at offs_i (possibly hopping over a v-table) and end at
// offs_c + sizeof(char)
int main()
{
const std::size_t size_A = sizeof(A);
const std::size_t size_int = sizeof(int);
const std::size_t size_float = sizeof(float);
const std::size_t size_char = sizeof(char);
const std::size_t offs_i = offsetof(A, i);
const std::size_t offs_f = offsetof(A, f);
const std::size_t offs_c = offsetof(A, c);
bool padded = false;
if (offs_f != size_int)
padded = true;
else if (offs_c != size_int + size_float)
padded = true;
std::cout << "padded? " << std::boolalpha << padded << std::endl;
}
एक struct गद्दी हैं, तो क्या वहाँ बाइट्स की एक सरणी है, उदा hashing अनुमति देने के लिए वैकल्पिक हल के लिए किसी भी तरह है पैडिंग बिट्स को शून्य-आउट करना?
"सुरक्षित" यहां दो स्ट्रक्चर का अर्थ है जो बराबर इच्छा हैश की समान मानों की तुलना करें।
क्या आपको अर्थपूर्ण, सदस्य-वार हैशिंग करने से रोक रहा है हर किसी की तरह? –
@LightnessRacesinOrbit आप एक ऐसा फ़ंक्शन कैसे बना सकते हैं जिसमें एक सामान्य संरचना प्रकार है? – Shoe
आप नहीं करेंगे, क्योंकि यह समझ में नहीं आता है। – Puppy