SHA-256 Ch

bitcoin

まず補助関数のChですね。

uint32_t Ch(uint32_t x, uint32_t y, uint32_t z) { return z ^ (x & (y ^ z)); }

この式の形。数学的に決まっているものだとすっかり勘違いしていました。ところが違います。
この形は一見すると「数学的に必然の形」に見えます。私自身、長い間そう思い込んでいました。
しかし実際には、これは定理から一意に導かれた形ではなく、設計上の選択です。
その証拠に、実際にChを僅かに変化させて測定した結果が以下になります。

=== Avalanche Analysis SHA256 Custom (Ch) ===
Pairs : 600000
Hash bits : 256
Mean distance : 127.983222 (expected 128.000000)
Variance : 63.948073 (expected 64.000000)
Chi^2 (Binom 0.5) : 95.137064 dof=122 approx p=9.657e-01

— Hamming distance histogram (k : count) —
0 : 0
1 : 0
2 : 0
3 : 0
4 : 0
5 : 0
6 : 0
7 : 0
125 : 27740
126 : 29158
127 : 29768
128 : 29795
129 : 29696
130 : 29187
131 : 27748

249 : 0
250 : 0
251 : 0
252 : 0
253 : 0
254 : 0
255 : 0
256 : 0

— Per-bit flip rate (MSB-first) —
bit[0] : 0.499597
bit[1] : 0.499708
bit[2] : 0.499763
bit[3] : 0.500443
bit[4] : 0.500250
bit[5] : 0.500472
bit[6] : 0.499853
bit[7] : 0.499417
bit[8] : 0.499757
bit[9] : 0.499563
bit[10] : 0.500745
bit[11] : 0.499220
bit[12] : 0.499698
bit[13] : 0.498427
bit[14] : 0.500568
bit[15] : 0.499987
bit[16] : 0.500303
bit[17] : 0.498902
bit[18] : 0.499625
bit[19] : 0.500057
bit[20] : 0.500253
bit[21] : 0.499083
bit[22] : 0.500208
bit[23] : 0.499467
bit[24] : 0.500855
bit[25] : 0.500538
bit[26] : 0.499548
bit[27] : 0.499980
bit[28] : 0.500330
bit[29] : 0.499373
bit[30] : 0.498497
bit[31] : 0.499288
bit[32] : 0.499338
bit[33] : 0.500385
bit[34] : 0.499805
bit[35] : 0.500922
bit[36] : 0.500257
bit[37] : 0.500670
bit[38] : 0.500082
bit[39] : 0.500293
bit[40] : 0.499983
bit[41] : 0.500315
bit[42] : 0.499108
bit[43] : 0.499100
bit[44] : 0.500648
bit[45] : 0.500248
bit[46] : 0.500163
bit[47] : 0.499490
bit[48] : 0.499713
bit[49] : 0.499380
bit[50] : 0.500687
bit[51] : 0.501125
bit[52] : 0.499473
bit[53] : 0.498463
bit[54] : 0.500492
bit[55] : 0.499782
bit[56] : 0.498760
bit[57] : 0.499995
bit[58] : 0.499568
bit[59] : 0.499522
bit[60] : 0.499130
bit[61] : 0.500050
bit[62] : 0.499280
bit[63] : 0.499603
bit[64] : 0.499967
bit[65] : 0.500802
bit[66] : 0.500868
bit[67] : 0.499028
bit[68] : 0.499943
bit[69] : 0.499443
bit[70] : 0.500893
bit[71] : 0.500345
bit[72] : 0.500350
bit[73] : 0.500457
bit[74] : 0.499623
bit[75] : 0.499623
bit[76] : 0.499703
bit[77] : 0.500187
bit[78] : 0.499150
bit[79] : 0.499047
bit[80] : 0.500898
bit[81] : 0.499523
bit[82] : 0.500282
bit[83] : 0.498278
bit[84] : 0.500037
bit[85] : 0.500073
bit[86] : 0.500270
bit[87] : 0.500158
bit[88] : 0.499728
bit[89] : 0.499695
bit[90] : 0.499628
bit[91] : 0.499718
bit[92] : 0.500895
bit[93] : 0.498367
bit[94] : 0.500288
bit[95] : 0.499850
bit[96] : 0.499177
bit[97] : 0.499343
bit[98] : 0.499828
bit[99] : 0.499933
bit[100] : 0.499328
bit[101] : 0.499822
bit[102] : 0.499978
bit[103] : 0.499697
bit[104] : 0.499755
bit[105] : 0.500622
bit[106] : 0.498787
bit[107] : 0.500430
bit[108] : 0.499253
bit[109] : 0.501018
bit[110] : 0.498778
bit[111] : 0.500042
bit[112] : 0.499827
bit[113] : 0.499950
bit[114] : 0.499605
bit[115] : 0.500163
bit[116] : 0.500720
bit[117] : 0.500598
bit[118] : 0.500807
bit[119] : 0.499398
bit[120] : 0.500517
bit[121] : 0.499585
bit[122] : 0.499715
bit[123] : 0.501122
bit[124] : 0.500427
bit[125] : 0.500275
bit[126] : 0.499623
bit[127] : 0.499370
bit[128] : 0.501025
bit[129] : 0.500527
bit[130] : 0.499650
bit[131] : 0.498060
bit[132] : 0.500292
bit[133] : 0.499337
bit[134] : 0.499445
bit[135] : 0.500420
bit[136] : 0.500128
bit[137] : 0.500170
bit[138] : 0.501248
bit[139] : 0.500768
bit[140] : 0.499783
bit[141] : 0.499190
bit[142] : 0.499803
bit[143] : 0.500095
bit[144] : 0.499932
bit[145] : 0.500143
bit[146] : 0.500563
bit[147] : 0.499945
bit[148] : 0.500302
bit[149] : 0.499775
bit[150] : 0.499592
bit[151] : 0.501235
bit[152] : 0.500077
bit[153] : 0.498953
bit[154] : 0.500050
bit[155] : 0.500000
bit[156] : 0.499732
bit[157] : 0.500302
bit[158] : 0.499928
bit[159] : 0.499862
bit[160] : 0.500162
bit[161] : 0.500208
bit[162] : 0.500313
bit[163] : 0.501833
bit[164] : 0.500173
bit[165] : 0.500540
bit[166] : 0.500212
bit[167] : 0.500120
bit[168] : 0.499718
bit[169] : 0.499530
bit[170] : 0.500282
bit[171] : 0.500648
bit[172] : 0.499813
bit[173] : 0.500292
bit[174] : 0.499868
bit[175] : 0.500592
bit[176] : 0.499505
bit[177] : 0.500950
bit[178] : 0.499583
bit[179] : 0.500067
bit[180] : 0.499593
bit[181] : 0.499887
bit[182] : 0.500138
bit[183] : 0.500185
bit[184] : 0.500932
bit[185] : 0.499888
bit[186] : 0.499620
bit[187] : 0.499827
bit[188] : 0.500255
bit[189] : 0.500347
bit[190] : 0.500658
bit[191] : 0.498915
bit[192] : 0.499557
bit[193] : 0.500328
bit[194] : 0.500143
bit[195] : 0.498972
bit[196] : 0.499743
bit[197] : 0.498960
bit[198] : 0.499627
bit[199] : 0.499097
bit[200] : 0.499188
bit[201] : 0.499360
bit[202] : 0.501167
bit[203] : 0.499508
bit[204] : 0.500737
bit[205] : 0.499885
bit[206] : 0.500028
bit[207] : 0.500255
bit[208] : 0.499707
bit[209] : 0.500013
bit[210] : 0.499740
bit[211] : 0.499607
bit[212] : 0.500670
bit[213] : 0.499550
bit[214] : 0.501058
bit[215] : 0.500178
bit[216] : 0.499370
bit[217] : 0.499718
bit[218] : 0.499930
bit[219] : 0.500162
bit[220] : 0.500580
bit[221] : 0.499502
bit[222] : 0.500062
bit[223] : 0.499353
bit[224] : 0.499877
bit[225] : 0.500008
bit[226] : 0.499197
bit[227] : 0.500378
bit[228] : 0.499313
bit[229] : 0.499385
bit[230] : 0.500393
bit[231] : 0.499285
bit[232] : 0.500818
bit[233] : 0.499797
bit[234] : 0.500497
bit[235] : 0.500015
bit[236] : 0.500043
bit[237] : 0.500525
bit[238] : 0.500200
bit[239] : 0.500305
bit[240] : 0.500452
bit[241] : 0.499842
bit[242] : 0.499652
bit[243] : 0.498727
bit[244] : 0.500582
bit[245] : 0.500075
bit[246] : 0.499832
bit[247] : 0.500215
bit[248] : 0.499982
bit[249] : 0.500155
bit[250] : 0.499085
bit[251] : 0.499923
bit[252] : 0.500028
bit[253] : 0.499985
bit[254] : 0.499715
bit[255] : 0.499973

すでにカスタム扱いで出力ハッシュ値がオリジナルとは異なります。
結局、そのようなカスタムでも雪崩効果やビット反転率は特に問題なく良好です。
つまり、調整して作られている。それがハッシュ関数でした。

タイトルとURLをコピーしました