MD5 বহুমাত্রিক অ্যারে সেরা উপায়?


120

একটি বহুমাত্রিক অ্যারের MD5 (বা অন্য কোনও হ্যাশ) উত্পন্ন করার সর্বোত্তম উপায় কী?

আমি সহজেই এমন একটি লুপ লিখতে পারি যা অ্যারের প্রতিটি স্তরের মধ্য দিয়ে যেতে পারে, প্রতিটি মানকে স্ট্রিংয়ের সাথে যুক্ত করে এবং স্ট্রিংয়ে এমডি 5 সম্পাদন করে।

তবে এটি সর্বোত্তমভাবে জটিল বলে মনে হচ্ছে এবং আমি ভাবছিলাম যে কোনও ফানকি ফাংশন আছে যা একটি বহুমাত্রিক অ্যারে নেবে এবং এটি হ্যাশ করবে।

উত্তর:


259

(নীচের অংশে অনুলিপি-এন-পেস্ট-সক্ষম ফাংশন)

পূর্বে উল্লিখিত হিসাবে, নিম্নলিখিতগুলি কাজ করবে।

md5(serialize($array));

তবে, এটি লক্ষণীয় যে (হাস্যকরভাবে) json_encode উল্লেখযোগ্যভাবে দ্রুত সম্পাদন করেছে :

md5(json_encode($array));

প্রকৃতপক্ষে, গতি বৃদ্ধি এখানে দ্বিগুণ হয়েছে কারণ (1) জসন_এনকোড এককভাবে সিরিয়ালের চেয়ে দ্রুত সঞ্চালন করে এবং (2) জসন_এনকোড একটি ছোট স্ট্রিং তৈরি করে এবং এমডি 5 হ্যান্ডেল করার জন্য কম less

সম্পাদনা করুন: এই দাবিকে সমর্থন করার জন্য এখানে প্রমাণ রয়েছে:

<?php //this is the array I'm using -- it's multidimensional.
$array = unserialize('a:6:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}i:5;a:5:{i:0;a:0:{}i:1;a:4:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}i:3;a:6:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}i:5;a:5:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}}}');

//The serialize test
$b4_s = microtime(1);
for ($i=0;$i<10000;$i++) {
    $serial = md5(serialize($array));
}
echo 'serialize() w/ md5() took: '.($sTime = microtime(1)-$b4_s).' sec<br/>';

//The json test
$b4_j = microtime(1);
for ($i=0;$i<10000;$i++) {
    $serial = md5(json_encode($array));
}
echo 'json_encode() w/ md5() took: '.($jTime = microtime(1)-$b4_j).' sec<br/><br/>';
echo 'json_encode is <strong>'.( round(($sTime/$jTime)*100,1) ).'%</strong> faster with a difference of <strong>'.($sTime-$jTime).' seconds</strong>';

JSON_ENCODE ধারাবাহিকভাবে 250% (2.5x) এরও বেশি দ্রুত (প্রায়শই 300% এর বেশি) - এটি কোনও তুচ্ছ তাত্পর্য নয়। আপনি এই লাইভ স্ক্রিপ্ট সহ পরীক্ষার ফলাফলগুলি দেখতে পাবেন:

এখন, লক্ষণীয় একটি বিষয় অ্যারে (1,2,3) অ্যারে হিসাবে একটি আলাদা MD5 উত্পাদন করবে (3,2,1) এটি যদি আপনি চান না হয়। নিম্নলিখিত কোড ব্যবহার করে দেখুন:

//Optionally make a copy of the array (if you want to preserve the original order)
$original = $array;

array_multisort($array);
$hash = md5(json_encode($array));

সম্পাদনা: আদেশটি বিপরীত করলে একই ফল পাওয়া যাবে কিনা তা নিয়ে কিছু প্রশ্ন রয়েছে। সুতরাং, আমি এটি এখানে ( সঠিকভাবে ) করেছি :

আপনি দেখতে পাচ্ছেন, ফলাফলগুলি ঠিক একই রকম। মূলত দ্রুপাল সম্পর্কিত কারও দ্বারা তৈরি করা ( সংশোধিত ) পরীক্ষাটি এখানে :

এবং ভাল পরিমাপের জন্য, এখানে একটি ফাংশন / পদ্ধতি আপনি কপি এবং পেস্ট করতে পারেন (5.3.3-1ubuntu9.5 তে পরীক্ষা করেছেন):

function array_md5(Array $array) {
    //since we're inside a function (which uses a copied array, not 
    //a referenced array), you shouldn't need to copy the array
    array_multisort($array);
    return md5(json_encode($array));
}

47
হাঃ হাঃ হাঃ! সত্যি? আমি "ওভার" অপ্টিমাইজেশনের পক্ষে ভোট পেয়েছি? বাস্তবে, পিএইচপি এর সিরিয়ালাইজ উল্লেখযোগ্যভাবে ধীর। আমি প্রমাণ সহ আমার উত্তর আপডেট করব ...
নাথন জেবি

19
নাথন এখানে যা করেছে তা মূল্যবান এমনকি যদি কেউ এর মান দেখতে না পারে তবে তা মূল্যবান। এটি আমাদের প্রেক্ষাপটের বাইরে এমন কিছু পরিস্থিতিতে মূল্যবান অপ্টিমাইজেশন হতে পারে। মাইক্রো অপ্টিমাইজেশান কিছু পরিস্থিতিতে একটি খারাপ সিদ্ধান্ত, তবে সমস্ত পরিস্থিতিতে নয়
সানডাউনে

13
আমি এটির জন্য মাইক্রো-অপ্টিমাইজেশনের জন্য এক নই, তবে যেখানে কোনও অতিরিক্ত কাজ না করে ডকুমেন্টেড পারফরম্যান্স বাড়ছে, তবে কেন এটি ব্যবহার করবেন না।
বাম্পারবক্স

2
আসলে, দেখে মনে হচ্ছে এটি অ্যারে কত গভীর হয় তার উপর নির্ভর করে। আমার যতটা সম্ভব দ্রুত চালানো দরকার এবং আপনার পোকা দেখায় যে json_encode () ~ 300% দ্রুত, যখন আমি আপনার কোডের $ অ্যারে ভেরিয়েবলটি আমার ব্যবহারের ক্ষেত্রে পরিবর্তন করি, তখন এটি ফিরে আসে serialize() w/ md5() took: 0.27773594856262 sec json_encode() w/ md5() took: 0.34809803962708 sec json_encode is (79.8%) faster with a difference of (-0.070362091064453 seconds)(ক্যালকুলেশন গণনা) স্পষ্টতই ভুল)। আমার অ্যারে 2 স্তর পর্যন্ত গভীর, তাই কেবল মনে রাখবেন যে (যথারীতি) আপনার মাইলেজ বিভিন্ন রকম হতে পারে।
সামিটনি

3
ঠিক আছে, নাথনের উত্তর কেন শীর্ষ উত্তর নয় তা আমি দেখতে পাচ্ছি না। সিরিয়াসলি, সিরিয়ালাইজ ব্যবহার করুন এবং আপনার ব্যবহারকারীদের একটি প্রচুর ধীর গতির সাথে বিরক্ত করুন। এপিক +1 @ নাথানজে.ব্রাউয়ার!
রিস্পান

168
md5(serialize($array));

13
যদি কোনও কারণে আপনি হ্যাশের সাথে মিল রাখতে চান (আঙুলের ছাপ) আপনি অ্যারে "বাছাই" বা "কেসোর্ট" বাছাই করার কথা বিবেচনা করতে পারেন, অতিরিক্তভাবে কিছু ধরণের স্ক্রাবিং / ক্লিনিংও প্রয়োগ করা প্রয়োজন হতে পারে
ফরইনস্পেস

9
দ্বিতীয় উত্তর থেকে জেসন_এনকোডের চেয়ে সিরিয়ালাইজ করা অনেক ধীরগতির। আপনার সার্ভারটি একটি আনন্দিত করুন এবং json_encode ব্যবহার করুন! :)
s3m3n

3
দেখে মনে হচ্ছে আপনার জেসন_এনকোড ব্যবহার করা উচিত বা সিরিয়ালাইজ করা উচিত কিনা তা বোঝার জন্য আপনার নিজের অ্যারে বেঞ্চমার্ক করা দরকার। অ্যারের উপর নির্ভর করে এটি পৃথক হয়।
লাইগামার

আমি বিশ্বাস করি এটি একটি ভুল উপায়, দয়া করে নীচে আমার ব্যাখ্যাটি দেখুন।
TermiT

1
@ জোয়েলপিটেট - না সেই ড্রুপাল লিঙ্কের উভয় উদাহরণেই বাগ রয়েছে। নীচে আমার উত্তরে মন্তব্য দেখুন। ;) উদাহরণস্বরূপ dl.rodboxusercontent.com/u/4115701/Screenshots/…
নাথান জেবি

26

আমি উত্তর দিয়ে খুব জনাকীর্ণ দলে যোগ দিচ্ছি, তবে একটি গুরুত্বপূর্ণ বিবেচনা রয়েছে যে বিদ্যমান কোনও উত্তরই সম্বোধন করে না। মান json_encode()এবং serialize()উভয় অ্যারের উপাদানগুলির ক্রমের উপর নির্ভর করে!

অ্যারিকে বাছাই এবং বাছাই না করার ফলাফল এখানে অভিন্ন মান সহ দুটি অ্যারেতে দেওয়া হয়েছে তবে ভিন্ন ক্রমে যুক্ত করা হয়েছে (পোস্টের নীচে কোড) :

    serialize()
1c4f1064ab79e4722f41ab5a8141b210
1ad0f2c7e690c8e3cd5c34f7c9b8573a

    json_encode()
db7178ba34f9271bfca3a05c5dddf502
c9661c0852c2bd0e26ef7951b4ca9e6f

    Sorted serialize()
1c4f1064ab79e4722f41ab5a8141b210
1c4f1064ab79e4722f41ab5a8141b210

    Sorted json_encode()
db7178ba34f9271bfca3a05c5dddf502
db7178ba34f9271bfca3a05c5dddf502

অতএব, আমি অ্যারে হ্যাশ করার জন্য দুটি পদ্ধতির সুপারিশ করব তা হ'ল :

// You will need to write your own deep_ksort(), or see
// my example below

md5(   serialize(deep_ksort($array)) );

md5( json_encode(deep_ksort($array)) );

আপনি যে জাতীয় ডেটা ব্যবহার করছেন তা পরীক্ষা করেjson_encode() বা তার পছন্দ নির্ধারণ করাserialize() উচিত । খাঁটি পাঠ্য এবং সংখ্যাসূচক তথ্যগুলিতে আমার নিজের পরীক্ষার দ্বারা, কোডটি যদি কয়েক হাজার বার একটি আঁটসাঁট লুপ না চালাচ্ছে তবে পার্থক্যটি এমনকি বেঞ্চমার্কিংয়ের পক্ষেও উপযুক্ত নয়। আমি ব্যক্তিগতভাবে ব্যবহারjson_encode() সেই ধরণের ডেটা ।

উপরের বাছাই পরীক্ষা উত্পন্ন করতে ব্যবহৃত কোডটি এখানে:

$a = array();
$a['aa'] = array( 'aaa'=>'AAA', 'bbb'=>'ooo', 'qqq'=>'fff',);
$a['bb'] = array( 'aaa'=>'BBBB', 'iii'=>'dd',);

$b = array();
$b['aa'] = array( 'aaa'=>'AAA', 'qqq'=>'fff', 'bbb'=>'ooo',);
$b['bb'] = array( 'iii'=>'dd', 'aaa'=>'BBBB',);

echo "    serialize()\n";
echo md5(serialize($a))."\n";
echo md5(serialize($b))."\n";

echo "\n    json_encode()\n";
echo md5(json_encode($a))."\n";
echo md5(json_encode($b))."\n";



$a = deep_ksort($a);
$b = deep_ksort($b);

echo "\n    Sorted serialize()\n";
echo md5(serialize($a))."\n";
echo md5(serialize($b))."\n";

echo "\n    Sorted json_encode()\n";
echo md5(json_encode($a))."\n";
echo md5(json_encode($b))."\n";

আমার দ্রুত ডিপ_কোর্ট () বাস্তবায়ন, এই ক্ষেত্রে ফিট করে তবে আপনার নিজের প্রকল্পে ব্যবহারের আগে এটি পরীক্ষা করে দেখুন:

/*
* Sort an array by keys, and additionall sort its array values by keys
*
* Does not try to sort an object, but does iterate its properties to
* sort arrays in properties
*/
function deep_ksort($input)
{
    if ( !is_object($input) && !is_array($input) ) {
        return $input;
    }

    foreach ( $input as $k=>$v ) {
        if ( is_object($v) || is_array($v) ) {
            $input[$k] = deep_ksort($v);
        }
    }

    if ( is_array($input) ) {
        ksort($input);
    }

    // Do not sort objects

    return $input;
}

10

উত্তরটি অ্যারে মানগুলির ডেটা ধরণের উপর নির্ভর করে। বড় স্ট্রিং ব্যবহার করুন:

md5(serialize($array));

সংক্ষিপ্ত স্ট্রিং এবং পূর্ণসংখ্যার জন্য ব্যবহার করুন:

md5(json_encode($array));

4 বিল্ট-ইন পিএইচপি ফাংশন অ্যারেটিকে স্ট্রিংয়ে রূপান্তর করতে পারে: সিরিয়ালাইজ () , জসন_এনকোড () , var_export () , মুদ্রণ_আর ()

বিজ্ঞপ্তি: মান হিসাবে স্ট্রিং সহ এসোসিয়েটিভ অ্যারে প্রসেস করার সময় json_encode () ফাংশনটি ধীর হয়ে যায়। এই ক্ষেত্রে সিরিয়ালাইজ () ফাংশনটি ব্যবহার করার কথা বিবেচনা করুন ।

কী এবং মানগুলিতে এমডি 5-হ্যাশগুলি (32 চর) সহ বহুমাত্রিক অ্যারের পরীক্ষার ফলাফল:

Test name       Repeats         Result          Performance     
serialize       10000           0.761195 sec    +0.00%
print_r         10000           1.669689 sec    -119.35%
json_encode     10000           1.712214 sec    -124.94%
var_export      10000           1.735023 sec    -127.93%

সংখ্যাযুক্ত বহুমাত্রিক অ্যারে পরীক্ষার ফলাফল:

Test name       Repeats         Result          Performance     
json_encode     10000           1.040612 sec    +0.00%
var_export      10000           1.753170 sec    -68.47%
serialize       10000           1.947791 sec    -87.18%
print_r         10000           9.084989 sec    -773.04%

সহযোগী অ্যারে পরীক্ষার উত্স । সংখ্যার অ্যারে পরীক্ষার উত্স


আপনি দয়া করে বড় এবং সংক্ষিপ্ত স্ট্রিং কি ব্যাখ্যা করতে পারেন ?
AL

1
@AL ছোট স্ট্রিংস - স্ট্রিংগুলিতে 25-30 টিরও কম অক্ষর রয়েছে। বড় স্ট্রিং - সবগুলিতে 25-30 টিরও বেশি অক্ষর থাকে।
আলেকজান্ডার ইয়ানচারুক

7

ব্রকের দুর্দান্ত উত্তর (+1) বাদে, কোনও শালীন হ্যাশিং লাইব্রেরি আপনাকে হ্যাশ ইনক্রিমেন্টে আপডেট করতে দেয়, সুতরাং আপনার প্রতিটি স্ট্রিং ক্রমানুসারে আপডেট করতে সক্ষম হওয়া উচিত, তার পরিবর্তে একটি বড় স্ট্রিং তৈরি করতে হবে।

দেখা: hash_update


এটি লক্ষণীয়, আপনি যদি ক্ষুদ্র টুকরোগুলি আপডেট করে থাকেন তবে এই পদ্ধতিটি অদক্ষ; যদিও এটি বিশাল ফাইলগুলির বিশাল অংশগুলির জন্য ভাল।
wrygiel

@Rrygiel এটি সত্য নয়। এমডি 5 এর জন্য, সর্বদা comp৪-বাইট ব্লকগুলিতে সংক্ষেপন করা হয় (আপনার "বড় অংশগুলি" এর আকার যাই হোক না কেন) এবং আপনি যদি এখনও কোনও ব্লক পূরণ না করে থাকেন তবে ব্লকটি পূরণ না হওয়া পর্যন্ত কোনও প্রসেসিং হয় না। (আপনি যখন হ্যাশটিকে চূড়ান্ত করবেন তখন চূড়ান্ত প্রক্রিয়াকরণের অংশ হিসাবে শেষের ব্লকটি পুরো ব্লক পর্যন্ত প্যাড করা হবে)) আরও পটভূমির জন্য, মর্কলে-ডামগার্ড নির্মাণ পড়ুন (যা MD5, SHA-1 এবং SHA-2 সবই ভিত্তিক )।
ক্রিস জেস্টার-ইয়ং

তুমি ঠিক বলছো. অন্য কোনও সাইটে মন্তব্য করে আমি পুরোপুরি বিভ্রান্ত হয়েছিলাম।
wrygiel

@ রাইগিয়েল সেজন্য "ইন্টারনেটে পাওয়া" একটি ধারণা অনুসরণ করার পরে এটি আপনার নিজের গবেষণা করার জন্য অর্থ প্রদান করে। ;-) এইভাবে বলতে গেলে, শেষ মন্তব্যটি আমার পক্ষে লেখা সহজ ছিল, কারণ আমি আসলে কয়েক বছর আগে স্ক্র্যাচ থেকে এমডি 5 বাস্তবায়ন করেছি (আমার স্কিম প্রোগ্রামিং দক্ষতার অনুশীলন করতে), তাই আমি এর কাজগুলি খুব ভাল জানি।
ক্রিস জেস্টার-ইয়ং

এটি আমি যা চাই ঠিক তাই। মেমরিতে বড় ট্রাকের ডেটা সরান এবং অনুলিপি করা কখনও কখনও গ্রহণযোগ্য হয় না। সুতরাং অন্যান্য উত্তরগুলির মতো সিরিয়ালাইজ () ব্যবহার করা পারফরম্যান্সের দিক থেকে একটি খুব খারাপ ধারণা। তবে এই এপিআইটি এখনও নিখোঁজ রয়েছে যদি আমি কেবল একটি নির্দিষ্ট অফসেট থেকে স্ট্রিংয়ের অংশটি হ্যাশ করতে চাই।
জিয়ানওয়ু চেন

4
md5(serialize($array));

কাজ করবে, তবে অ্যারের ক্রমের উপর নির্ভর করে হ্যাশ পরিবর্তিত হবে (এটি যদিও তাতে কিছু যায় আসে না)।


3

নোট করুন serializeএবং json_encodeসংখ্যার অ্যারে আসে যেখানে কীগুলি 0 থেকে শুরু হয় না, বা সহযোগী অ্যারেগুলিতে আলাদাভাবে কাজ করুন। json_encodeযেমন হিসাবে অ্যারে সংরক্ষণ করবে Object, সুতরাং json_decodeএকটি ফিরে আসে Object, unserializeঠিক একই কী সঙ্গে একটি অ্যারে ফিরে আসবে।


3

আমি মনে করি এটি একটি ভাল টিপ হতে পারে:

Class hasharray {

    public function array_flat($in,$keys=array(),$out=array()){
        foreach($in as $k => $v){
            $keys[] = $k; 
            if(is_array($v)){
                $out = $this->array_flat($v,$keys,$out);
            }else{
                $out[implode("/",$keys)] = $v;
            }
            array_pop($keys);
        }
        return $out;  
    }

    public function array_hash($in){
        $a = $this->array_flat($in);
        ksort($a);
        return md5(json_encode($a));
    }

}

$h = new hasharray;
echo $h->array_hash($multi_dimensional_array);

2

সম্পর্কে গুরুত্বপূর্ণ নোট serialize()

আমি এটি হ্যাশিং ফাংশনের অংশ হিসাবে ব্যবহার করার পরামর্শ দিচ্ছি না কারণ এটি নিম্নলিখিত উদাহরণগুলির জন্য বিভিন্ন ফলাফল দিতে পারে। নীচের উদাহরণটি দেখুন:

সাধারণ উদাহরণ:

$a = new \stdClass;
$a->test = 'sample';

$b = new \stdClass;
$b->one = $a;
$b->two = clone $a;

উত্পাদন

"O:8:"stdClass":2:{s:3:"one";O:8:"stdClass":1:{s:4:"test";s:6:"sample";}s:3:"two";O:8:"stdClass":1:{s:4:"test";s:6:"sample";}}"

তবে নিম্নলিখিত কোড:

<?php

$a = new \stdClass;
$a->test = 'sample';

$b = new \stdClass;
$b->one = $a;
$b->two = $a;

আউটপুট:

"O:8:"stdClass":2:{s:3:"one";O:8:"stdClass":1:{s:4:"test";s:6:"sample";}s:3:"two";r:2;}"

সুতরাং দ্বিতীয় বস্তুর পরিবর্তে পিএইচপি কেবল "r: 2" লিঙ্ক তৈরি করুন; প্রথম উদাহরণ। এটি ডেটা ক্রমিকায়িত করার জন্য অবশ্যই ভাল এবং সঠিক উপায়, তবে এটি আপনার হ্যাশিং ফাংশন নিয়ে সমস্যাগুলির দিকে নিয়ে যেতে পারে।


2
// Convert nested arrays to a simple array
$array = array();
array_walk_recursive($input, function ($a) use (&$array) {
    $array[] = $a;
});

sort($array);

$hash = md5(json_encode($array));

----

These arrays have the same hash:
$arr1 = array(0 => array(1, 2, 3), 1, 2);
$arr2 = array(0 => array(1, 3, 2), 1, 2);

1

json_code ব্যবহার করতে বলা বেশ কয়েকটি উত্তর রয়েছে,

তবে json_encode iso-8859-1 স্ট্রিংয়ের সাথে সূক্ষ্মভাবে কাজ করে না, একটি বিশেষ চর উপস্থিত হওয়ার সাথে সাথেই স্ট্রিংটি ক্রপ করা হয়।

আমি var_export ব্যবহার করার পরামর্শ দেব:

md5(var_export($array, true))

সিরিয়ালের মতো ধীর নয়, জসন_কেনডের মতো বুগড নয়


এত তাড়াতাড়ি নয়, সর্বোত্তম বিকল্পগুলি এমডি 4 ব্যবহার করা হয়, ভ্যার_এক্সপোর্টও ধীর
ব্যবহারকারী 95656584

0

বর্তমানে সর্বাধিক আপ-ভোট দেওয়া উত্তর md5(serialize($array));বস্তুগুলির সাথে ভাল কাজ করে না।

কোড বিবেচনা করুন:

 $a = array(new \stdClass());
 $b = array(new \stdClass());

অ্যারেগুলি পৃথক হলেও (এগুলিতে বিভিন্ন জিনিস রয়েছে), ব্যবহার করার সময় তাদের একই হ্যাশ রয়েছে md5(serialize($array));। সুতরাং আপনার হ্যাশ অকেজো!

সমস্যাটি এড়াতে, আপনি spl_object_hash()সিরিয়ালাইজ করার আগে অবজেক্টগুলিকে প্রতিস্থাপন করতে পারেন । আপনার অ্যারের একাধিক স্তর থাকলে আপনার এটি পুনরাবৃত্তভাবেও করা উচিত।

ডটানকোহেনের পরামর্শ অনুসারে নীচের কোডগুলি কী দ্বারা অ্যারে বাছাই করে।

function replaceObjectsWithHashes(array $array)
{
    foreach ($array as &$value) {
        if (is_array($value)) {
            $value = $this->replaceObjectsInArrayWithHashes($value);
        } elseif (is_object($value)) {
            $value = spl_object_hash($value);
        }
    }
    ksort($array);
    return $array;
}

এখন আপনি ব্যবহার করতে পারেন md5(serialize(replaceObjectsWithHashes($array)))

(নোট করুন যে পিএইচপি-তে অ্যারেটি মান ধরণের So তাই replaceObjectsWithHashesফাংশনটি মূল অ্যারে পরিবর্তন করবেন না))


0

আমি সমাধানটি এত সহজে উপরে দেখিনি তাই আমি একটি সহজ উত্তরের অবদান রাখতে চাই wanted আমার জন্য, আমি ksort (কী বাছাই) ব্যবহার না করা পর্যন্ত আমি একই কী পেয়েছিলাম:

কেসোর্টের সাথে প্রথমে সাজানো, তারপরে একটি জসন_কেনডে sha1 সঞ্চালন করা হয়েছে:

ksort($array)
$hash = sha1(json_encode($array) //be mindful of UTF8

উদাহরণ:

$arr1 = array( 'dealer' => '100', 'direction' => 'ASC', 'dist' => '500', 'limit' => '1', 'zip' => '10601');
ksort($arr1);

$arr2 = array( 'direction' => 'ASC', 'limit' => '1', 'zip' => '10601', 'dealer' => '100', 'dist' => '5000');
ksort($arr2);

var_dump(sha1(json_encode($arr1)));
var_dump(sha1(json_encode($arr2)));

পরিবর্তিত অ্যারে এবং হ্যাশগুলির আউটপুট:

string(40) "502c2cbfbe62e47eb0fe96306ecb2e6c7e6d014c"
string(40) "b3319c58edadab3513832ceeb5d68bfce2fb3983"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.