рд╢рд┐рд╢реБрдЖ: рджреБрдирд┐рдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬ рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░


рдЫрд╣ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ, рдореИрдВ рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЫрджреНрдо рдЖрдпрд╛рдореА рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ (PRNG) рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдп рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рд╕рдмрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬреА рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реАрдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рдореЗрд░реЗ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд▓рд┐рдП, рдЬрдЯрд┐рд▓рддрд╛ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрдврд╝реАред рдЪреА-рд╕реНрдХреНрд╡рд╛рдпрд░ рдмрд╛рдЗрдЯ рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╕рд╛рдмрд┐рдд рд╣реБрдЖ! рдмрд╛рдж рдореЗрдВ рдбреИрдирд╣рд╛рд░реНрдб рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред рдореИрдВрдиреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЕрдиреНрдп рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП ред рд╣рд╛рд▓рд╛рдБрдХрд┐ , рдЙрд╕ рд╕рдордп рдкреНрд░реЗрдХреНрдЯреИрдВрдб рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛ ред

рддрдм рдмрд┐рдЧ рдХреНрд░рд╢ рдЯреЗрд╕реНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдерд╛ ред

рддрдм рдкреНрд░реИрдХреНрдЯреНрд░реИрдВрдб рдкрд╛рд╕ рдХрд░рддреЗ рд╕рдордп 32 рдЯреЗрд░рд╛рдмрд╛рдЗрдЯ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред рдЧрддрд┐ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрди рдЧрдИ рд╣реИред рдпрд╣ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛ рдЬреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рджрд╕ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реИрдХреНрдЯреНрд░реИрдВрдб рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рдорд╣реАрдиреЗ рдХрд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХреА рдЧрддрд┐ рд╕реЗ рдЗрд╕ рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред

рдЬрдм рдЖрдк рдЗрддрдиреА рдКрдБрдЪрд╛рдИ рддрдХ рдмрдврд╝ рдЬрд╛рддреЗ рд╣реИрдВ ... рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдкреЗрд░реЗрдЯреЛ рд╕реАрдорд╛ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рджреБрдирд┐рдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ PRNG рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдХрд╛рдордпрд╛рдм рд╣реБрдЖред

рдПрдХ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ, рдореИрдВ рдореИрдВ рдХреНрдпрд╛ рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрд╛ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред рдФрд░ рдпрд╣рд╛рдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЕрдВрддрд┐рдо рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред

рдЙрджреНрджреЗрд╢реНрдп


рдЖрдЗрдП рд╕реНрдкрд╖реНрдЯ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ: рдЧрддрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ ред рдореИрдВрдиреЗ рдЖрдзреБрдирд┐рдХ x86-64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдЗрдВрдЯреЗрд▓ рдФрд░ рдПрдПрдордбреА рдкреНрд░реЛрд╕реЗрд╕рд░) рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ред

рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рд╕рд┐рдХ рд╕реАрдкреАрдмреА рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ : рдпрд╣ рдПрдХ рдмрд╛рдЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрдХреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЗрд╕ рдореАрдЯреНрд░рд┐рдХ рдХреА рдЧрдгрдирд╛ рдФрд░ рд╕рднреА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ ред рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдпрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рд╕реАрдкреАрдкреА рджреБрдирд┐рдпрд╛ рднрд░ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдпрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЬреАрдд рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕реАрдкреАрдмреА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  1. рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ,
  2. рдпрд╛ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ,
  3. рдпрд╛ рдХрд╛рдо рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░реЗрдВред

рд╣рдо рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХрд░реЗрдВрдЧреЗред

рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЕрдзрд┐рдХ рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдбрд░ рдерд╛ рдХрд┐ рд╡реЗ рдореБрдЭреЗ рдмрддрд╛рдПрдВрдЧреЗ: "рдЕрдЧрд░ рдпрд╣ 32-рдмрд┐рдЯ рдирдВрдмрд░ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ PRSP рдирд╣реАрдВ рд╣реИ" рдпрд╛ 64-рдмрд┐рдЯ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рд╣реИред рдпрд╛: "PRNG рдХреЗрд╡рд▓ x86-64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП," рдЬреИрд╕реЗ рдХрд┐ POPCNT рдЬреИрд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдпрд╛% xmm7 рдЬреИрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдирд┐рд╖рд┐рджреНрдз рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, PRNG рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рд╣реИ: рдЬрдирд░реЗрдЯрд░ рдХрдИ рджрд╢рдХреЛрдВ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ! рдЬрдм рдПрд╕рдУрдПрд▓ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рддреЛ рд╡реЗ рдЙрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд▓рдЧреЗред 64-рдмрд┐рдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдЙрдиреНрд╣реЛрдВрдиреЗ% rax рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдмреЗрд╢рдХ, рдПрдЖрд░рдПрдо рдкрд░, рдРрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдзреАрдореЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдмрд╛рдХреА рд╣реИ), рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдВрдбреНрд░реЙрдЗрдб рдХреЛ 2019 рдореЗрдВ 64-рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА 64-рдмрд┐рдЯ рдкреАрдЖрд░рдПрди рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛!

рдпрд╣реА рд╣реИ, рдпрд╣ рдХреНрд╖реЗрддреНрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред рдФрд░ рдЖрдЬ, AVX2 рдХреЗ рдХрд╛рд░рдг рдЗрдВрдЯреЗрд▓ рдФрд░ рдПрдПрдордбреА рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 256-рдмрд┐рдЯ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред RC4 рдиреЗ 1 рдмрд╛рдЗрдЯ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛, drand48 рдПрдХ рдмрд╛рд░ рдореЗрдВ 4 рдмрд╛рдЗрдЯреНрд╕ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, pcg64 - 8 рдмрд╛рдЗрдЯреНрд╕, рдФрд░ рдЕрдм рд╣рдо рддреБрд░рдВрдд 32 рдмрд╛рдЗрдЯреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

8 рдмрд╛рдЗрдЯреНрд╕ 64-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреБрдЫ рднрд╛рд╖рд╛рдПрдВ 16 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ (рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдЕрдкрд╡рд╛рдж C рдореЗрдВ __uint128_t рд╣реИ)ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдо рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ 32 рдмрд╛рдЗрдЯреНрд╕ (рдЖрдВрддрд░рд┐рдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдЯрд╛рдЗрдк рд╣реИрдВред

рддреЛ рд╣рдо PRNG рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдЕрд▓рд╡рд┐рджрд╛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг Vigny HWD рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕реЗ ):

static uint64_t next(void);

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдмрдлрд░ рдХреЛ рднрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕реЗ ):

void prng_gen(prng_state *s, __uint64_t buf[], __uint64_t size);

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реИрдВ?

рдпрджрд┐ рдЖрдкрдХрд╛ рдЬрдирд░реЗрдЯрд░ рдПрдХ рдмрд╛рд░ рдореЗрдВ 32 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдПрдХ рд╕рд░рдгреА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ 32 рдХрд╛ рдЧреБрдгрдХ рд╣реИ (рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ 32 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд)ред рдпрджреНрдпрдкрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ рдмрдлрд░ рднрд░реЗрдВрдЧреЗред рд╣рдо рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдкреНрд░рдпреБрдХреНрдд рдбреЗрдЯрд╛ рдХреЛ рдирд┐рдХрд╛рд▓ рджреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рднрд░ рджреЗрдВрдЧреЗред рджреЗрд░реА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ: рдХреБрдЫ рдХреЙрд▓ рд╕рд┐рд░реНрдл рдмрдлрд░ рдкрдврд╝реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдФрд╕рддрди рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред

рдЕрдм рд╣рдо рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рддреЗ рд╣реИрдВ?

рд╕рдорд╛рдирддрд╛


рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рднреА рд╕реНрддрд░реЛрдВ рдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдЙрдкрдХрд░рдг рдХрд╛ рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпреЗ SIMD рдирд┐рд░реНрджреЗрд╢ (рдПрдХрд▓-рдирд┐рд░реНрджреЗрд╢, рдПрдХрд╛рдзрд┐рдХ рдбреЗрдЯрд╛) рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, AVX2 рдПрдХ рд╕рд╛рде рдЪрд╛рд░ 64-рдмрд┐рдЯ рдкрд░рд┐рд╡рд░реНрдзрди рдпрд╛ рдЖрда 32-рдмрд┐рдЯ рдкрд░рд┐рд╡рд░реНрдзрди рдЖрджрд┐ рдХрд░рддрд╛ рд╣реИред

рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрднрдЧ рдкрдВрджреНрд░рд╣ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдХреЙрдирдХрд░реА рдиреЗ ChaCha20 рдХрд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдИрдПрд╕рдПрдирдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, NORX рдФрд░ Gimli рдХреЛ рд╕рдорд╛рдирддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдЧреИрд░-рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ PRNG рд╕рдореБрджрд╛рдп рдореЗрдВ рднреА рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рдмрдврд╝реА рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореМрдЬреВрджрд╛ рдЖрджрд┐рдо рдЬреЛ рдХрд┐ SIMD рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗ, рд╡реЗ рдмрд╣реБрдд рддреЗрдЬрд╝ PRN рдмрдирд╛рдиреЗ рдХрд╛ рдЖрдзрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрдм рд╕реЗрдмреЗрд╕реНрдЯрд┐рдпрд╛рдиреЛ рд╡рд┐рдЧреНрдирд╛ рдиреЗ рдЬреВрд▓рд┐рдпрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЕрдкрдиреЗ xoshiro256 ++ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджрд┐рдпрд╛ , рддреЛ рдЙрдиреНрд╣реЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рд╕рднреА PRNR рдореЗрдВ рдПрдХ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрда рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╛рд░рдВрднрд┐рдХ PRNG рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

SIMD рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░реАрдХрд░рдг рдХреЗ рд╕реНрддрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдореИрдВ рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ , рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреВрдВрдЧрд╛ред

рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрдИ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрджрд┐ рдЪрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдХреНрд░рдо рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИ, рддреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рддреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Superscalar рдирд┐рд╖реНрдкрд╛рджрди рдЖрдкрдХреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рдкрдврд╝рдиреЗ-рд▓рд┐рдЦрдиреЗ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЖрдк рдкрдврд╝рдиреЗ рд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд░рдХреЗ рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрд╕рд╛рдзрд╛рд░рдг рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдХреНрд░рдо рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рддреИрдпрд╛рд░ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдкрд┐рдЫрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдЕрднреА рддрдХ рддреИрдпрд╛рд░ рди рд╣реЛрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкрдарди-рдкрд╛рдарди рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдФрд░ рдЕрдм рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ!

рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░


рдЕрд░реНрдзрд╢рд┐рд╢реБ рдирд╛рдордХ рдпреЛрдЬрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬрд╣рд╛рдВ рд╕реЗ рдРрд╕рд╛ рдирд╛рдо рдЖрддрд╛ рд╣реИ рдЖрдк рдкрдврд╝рддреЗ рд╣реА рдзреАрд░реЗ-рдзреАрд░реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


рд▓рд╛рдЗрди рд╕реЗ рдЗрд╕рдХреА рд▓рд╛рдЗрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

typedef struct prng_state {
  __m256i state[2];
  __m256i output;
  __m256i counter;
} prng_state;

рд░рд╛рдЬреНрдп рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ AVX2 рд░рдЬрд┐рд╕реНрдЯрд░ (256 рдмрд┐рдЯреНрд╕) рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рд░рд╛рдЬреНрдп рдХреЗ рдкрд╛рд╕ рд╣реА рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд░рд╛рдЬреНрдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 64-рдмрд┐рдЯ рдХрд╛рдЙрдВрдЯрд░ рднреА рд╣реИред рдЧрдгрдирд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдПрд╡реАрдПрдХреНрд╕ 2 рд░рдЬрд┐рд╕реНрдЯрд░ рднреА рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ AVX2 рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: рд╕рд╛рдзрд╛рд░рдг рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ (% rax рдФрд░ рдЗрд╕реА рддрд░рд╣) рдХреЛ MOV рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ SIMD рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ RAM (рдЕрдХреНрд╕рд░ рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рджреЗрд░реА рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ рджреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИ (рд╕реНрдЯреИрдХ рдкрд░ рдПрдордУрд╡реА, рд╕реНрдЯреИрдХ рд╕реЗ рд╡реАрдПрдордУрд╡реА)ред

рдЕрдм рд╣рдо рдкреАрдврд╝реА рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдЪрд▓реЛ рд▓реЛрдб рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдмрдлрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЗрд╕реЗ 32 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рднрд░рддреЗ рд╣реИрдВред

inline void prng_gen(prng_state *s, __uint64_t buf[], __uint64_t size) {
  __m256i s0 = s->state[0], counter = s->counter,
          s1 = s->state[1],       o = s->output;
  for (__uint64_t i = 0; i < size; i += 4) {
    _mm256_storeu_si256((__m256i*)&buf[i], o);
    // тАж
  }
  s->state[0] = s0; s->counter = counter;
  s->state[1] = s1; s->output  = o;
}

рдЪреВрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЗрдирд▓рд╛рдЗрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдмрдлрд░ рдХреЛ рддреБрд░рдВрдд рднрд░рдиреЗ рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЕрд╕рд╛рдзрд╛рд░рдг рдирд┐рд╖реНрдкрд╛рджрди рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

рд▓реВрдк рдХреЗ рдЕрдВрджрд░, рд╣рдо рдЬрд▓реНрджреА рд╕реЗ рддреАрди рд░рд╛рдЬреНрдп рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ:

  1. SHI рдлреАрдЯ
  2. SHU ffle
  3. рдПрдХ рдбреА.рдбреА.

рдЗрд╕рд▓рд┐рдП рдирд╛рдо SHISHUA!

рдкрд╣рд▓реА рдкрд╛рд░реА


u0 = _mm256_srli_epi64(s0, 1);              u1 = _mm256_srli_epi64(s1, 3);

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, AVX2 рд░реЗрд╡реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреЛ 64-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ! рдФрд░ рд╢рд┐рдлреНрдЯ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рд╣рдо рдПрдХ рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рд╢рд┐рдлреНрдЯ рдХрд░реЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ рд╕рднреА 64-рдмрд┐рдЯ рд╕реНрдерд┐рддрд┐ рдХрд╛ рджреМрд░рд╛ рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЖрдзрд╛ рдирд╣реАрдВред

рд╢рд┐рдлреНрдЯ рдХреЗ рджреМрд░рд╛рди, рдмрд┐рдЯ рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рд░рд╛рдЬреНрдп рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмреБрд░рд╛ рд╣реИ, рдЖрдкрдХреЛ рдШрд╛рдЯреЗ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛рдПрдВ 1 рдФрд░ 3 рд╣реИрдВ, рд╣рдо рджреЛ рднрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рд╕рдВрдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдмрджрд▓рд╛рд╡ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЙрдирдХреЗ рдЖрддреНрдо-рд╕рд╣рд╕рдВрдмрдВрдз рдХреА рд╕рдорд╛рдирддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рд╣рдо рджрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рджрд╛рд╣рд┐рдиреЗ рдмрд┐рдЯреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝ рдХреЗ рджреМрд░рд╛рди рд╕рдмрд╕реЗ рдХрдо рдкреНрд░рд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, A + B рдореЗрдВ рд╕рдмрд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рд╕рд┐рд░реНрдл A рдФрд░ B рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ XOR рд╣реИред

рд╕рд░рдЧрд░реНрдореА


t0 = _mm256_permutevar8x32_epi32(s0, shu0); t1 = _mm256_permutevar8x32_epi32(s1, shu1);

рд╣рдо 32-рдмрд┐рдЯ рдорд┐рд╢реНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 64-рдмрд┐рдЯ рд╕рдВрдЪрд╛рд▓рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЧреНрд░реИрдиреНрдпреБрд▓реИрд░рд┐рдЯреА рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдо рд╣рд░ рдЬрдЧрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (64-рдмрд┐рдЯ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрддрд╛ рд╣реИ)ред рдпрд╣ рдПрдХ рдХреНрд░реЙрд╕-рд▓реЗрди рдСрдкрд░реЗрд╢рди рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдЕрдиреНрдп рд╢рдлрд╝рд▓ рдмрд╛рдИрдВ рдУрд░ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреЛ рд▓реЗрдлреНрдЯ 128 рдмрд┐рдЯреНрд╕ рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡реЗ рдмрд╛рдИрдВ рдУрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рд░рд╛рдЗрдЯ 128 рдмрд┐рдЯреНрд╕ рдХреЗ рднреАрддрд░ рдпрджрд┐ рд╡реЗ рджрд╛рдИрдВ рдУрд░ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред

рдорд┐рд╢реНрд░рдг рд▓рдЧрд╛рддрд╛рд░:

__m256i shu0 = _mm256_set_epi32(4, 3, 2, 1, 0, 7, 6, 5),
        shu1 = _mm256_set_epi32(2, 1, 0, 7, 6, 5, 4, 3);

рддрд╛рдХрд┐ рдорд┐рд╢реНрд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИ, рд╣рдо рдХрдордЬреЛрд░ (рдХрдо рдлреИрд▓рд╛рд╡) 64-рдмрд┐рдЯ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ 32-рдмрд┐рдЯ рднрд╛рдЧреЛрдВ рдХреЛ рдордЬрдмреВрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдЕрдЧрд▓реЗ рдЬреЛрдбрд╝ рдЙрдиреНрд╣реЗрдВ рд╕рдореГрджреНрдз рдХрд░реЗрдВред

64-рдмрд┐рдЯ рдЪрдВрдХ рдХрд╛ рдХрдо-рдЕрдВрдд 32-рдмрд┐рдЯ рд╣рд┐рд╕реНрд╕рд╛ рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╡рд╛рд▓реЗ рднрд╛рдЧ рдХреЗ рд╕рдорд╛рди 64-рдмрд┐рдЯ рдЪрдВрдХ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреЛрдиреЛрдВ рднрд╛рдЧ рдПрдХ рд╣реА рдЪрдВрдХ рдХреЗ рднреАрддрд░ рдирд╣реАрдВ рд░рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдорд┐рд╢реНрд░рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ 32-рдмрд┐рдЯ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХ рд╕рд░реНрдХрд▓ рдореЗрдВ рд╕рднреА рдкрджреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ: рдП рд╕реЗ рдмреА, рдмреА рд╕реЗ рд╕реА, ... рдПрдЪ рд╕реЗ рдП рддрдХ

рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрди рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд┐рд╢реНрд░рдг рджреЛ 256-рдмрд┐рдЯ рд╣реИред рдЯрд░реНрдирдУрд╡рд░ (рдХреНрд░рдорд╢рдГ 96 рдмрд┐рдЯреНрд╕ рдФрд░ рджрд╛рдИрдВ рдУрд░ 160 рдмрд┐рдЯреНрд╕ рдХреА рдХреНрд░рд╛рдВрддрд┐рдпрд╛рдВ)ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛


рдЪрд▓реЛ рджреЛ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рд╕реЗ 64-рдмрд┐рдЯ рд╡рд┐рдЦрдВрдбреВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ - рд╢рд┐рдлреНрдЯ рдФрд░ рдорд┐рд╢реНрд░рдгред

s0 = _mm256_add_epi64(t0, u0);              s1 = _mm256_add_epi64(t1, u1);

рдЬреЛрдбрд╝ рдлреИрд▓рд╛рд╡ рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рд╣реИ: рдЗрд╕ рдСрдкрд░реЗрд╢рди рдореЗрдВ, рдмрд┐рдЯреНрд╕ рдХреЛ XOR рдФрд░ irreducible рд╕рдВрдпреЛрдЬрдиреЛрдВ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ 64-рдмрд┐рдЯ рдкрджреЛрдВ рдкрд░ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдкреНрд░реЗрд╢рдиред

рдПрдХ рд░рд╛рдЬреНрдп рдХреЗ рднреАрддрд░ рдЬреЛрдбрд╝ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЗрд╕ рдлреИрд▓рд╛рд╡ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди


рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд╣рд╛рдВ рд╕реЗ рдорд┐рд▓реЗрдЧрд╛?

рдпрд╣ рд╕рд░рд▓ рд╣реИ: рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╕рдВрд░рдЪрдирд╛ рд╣рдореЗрдВ s0 рдФрд░ s1 рд░рд╛рдЬреНрдп рдХреЗ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рднрд╛рдЧреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрди рдкрд░ XOR рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдЬрд┐рд╕ рдбреЗрдЯрд╛ рдкрд░ рд╣рдо XOR рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдмреАрдЪ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЖрдВрд╢рд┐рдХ рдкрд░рд┐рдгрд╛рдо рд▓реЗрддреЗ рд╣реИрдВ: рдПрдХ рд░рд╛рдЬреНрдп рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рднрд╛рдЧ рдФрд░ рджреВрд╕рд░реЗ рдХрд╛ рдорд┐рд╢реНрд░рд┐рдд рднрд╛рдЧред

o = _mm256_xor_si256(u0, t1);

рдпрд╣ рдПрдХ рд╕реБрдкрд░рдХреЗрд╕рд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмреАрдЪ рд░реАрдб-рд░рд╛рдЗрдЯ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ u0 рдФрд░ t1 s0 рдФрд░ s1 рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдереЗред

рдЕрдм рдХрд╛рдЙрдВрдЯрд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдЪрдХреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдерд┐рддрд┐ рдмрджрд▓реЗрдВ рдФрд░ рдлрд┐рд░ рдХрд╛рдЙрдВрдЯрд░ рдорд╛рди рдмрдврд╝рд╛рдПрдБ:

s1 = _mm256_add_epi64(s1, counter);
counter = _mm256_add_epi64(counter, increment);

рд╣рдо рдкрд╣рд▓реЗ рд░рд╛рдЬреНрдп рдХреЛ рдХреНрдпреЛрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ? s1 рдкрд╣рд▓реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ рдХрд┐ рдмрд╛рдж рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдЬреЛ рдЗрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ рд╡реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рд╕рд╛рде рд╣реА, рдпрд╣ рдЕрдиреБрдХреНрд░рдо рд░реАрдб-рд░рд╛рдЗрдЯ рдХрд╛рдЙрдВрдЯрд░ рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдХрд╛рдЙрдВрдЯрд░ рдХреЛ s1 рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ s0 рдкрд░ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рд╡реИрд╕реЗ рднреА рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, s1 рд╢рд┐рдлреНрдЯ рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХ рдмрд┐рдЯреНрд╕ рдЦреЛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╢рд┐рдлреНрдЯ рдХреЗ рдмрд╛рдж "рдЕрдкрдиреЗ рдкреИрд░реЛрдВ рдкрд░" рдЬрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдХрд╛рдЙрдВрдЯрд░ рдкреНрд░реИрдХреНрдЯреНрд░реИрдВрдб рдЯреЗрд╕реНрдЯ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп 2 69 рдХреА рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИрдмрд╛рдЗрдЯреНрд╕ = PRNG рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП 512 рдПрдХреНрд╕рд┐рдмрд╛рдЗрдЯреНрд╕: рд╣рдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 10 рдЧрд┐рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЧрддрд┐ рд╕реЗ рдПрдХ рд╕рд╣рд╕реНрд░рд╛рдмреНрджреА рдХреЗ рдмрд╛рдж рд╣реА рдЪрдХреНрд░ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╢рддрд╛рдмреНрджрд┐рдпреЛрдВ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзреАрдорд╛ рд╣реЛрдЧрд╛ред

рдмрдврд╝рддреЗ рдХреНрд░рдо рдореЗрдВ:

__m256i increment = _mm256_set_epi64x(1, 3, 5, 7);

рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╡реЗрддрдирд╡реГрджреНрдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдореВрд▓ рдХреЛрдкрд░реЗрдо рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рдорд┐рдд рдХреНрд╖реЗрддреНрд░ GF (2 64 ) рдХреЗ рдкреВрд░реЗ рдЪрдХреНрд░ рдХреЛ рдХрд╡рд░ рдХрд░рддреА рд╣реИ , рдФрд░ рд╕рднреА рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдиреБрднреВрддрд┐ рд╣реЛрддреА рд╣реИред 2. рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдЖрдк 0 рд╕реЗ рд╕реАрдорд╛ рддрдХ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред 4, 4 рдХреЗ рдмрд╛рдж 0 рдкрд░ рд▓реМрдЯ рд░рд╣рд╛ рд╣реИ, рдпрд╣ 0-2-0-2- ... рдЕрдиреБрдХреНрд░рдо рдХреЛ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрднреА 1 рдпрд╛ 3 рдХрд╛ рдиреЗрддреГрддреНрд╡ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдФрд░ рд╡рд┐рд╖рдо рд╡реГрджреНрдзрд┐ рд╕рднреА рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░рддреА рд╣реИред

рд░рд╛рдЬреНрдп рдореЗрдВ рд╕рднреА 64-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рдорд┐рд╢реНрд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛ рджреЗрдВрдЧреЗред рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛рдПрдБ рдЪреБрдиреАрдВ рддрд╛рдХрд┐ рд╡реЗ рдЬрд╛рджреБрдИ рди рджрд┐рдЦреЗрдВред

рдпрд╣ рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рд╕рдВрдХреНрд░рдордг рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ?

рдкреНрд░рд╛рд░рдВрдн


рд╣рдо рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдЕрдВрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд╛рдЬреНрдп рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ using, рдЕрдкрд░рд┐рдореЗрдп рд╕рдВрдЦреНрдпрд╛ рдЬреЛ рдХрд┐ рдЕрдВрд╢ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИред

static __uint64_t phi[8] = {
  0x9E3779B97F4A7C15, 0xF39CC0605CEDC834, 0x1082276BF3A27251, 0xF86C6A11D0C18E95,
  0x2767F0B153D27B7F, 0x0347045B5BF1827F, 0x01886F0928403002, 0xC1D64BA40F335E36,
};

рдПрдХ 256-рдмрд┐рдЯ рдмреАрдЬ рд▓реЗрдВред рдпрд╣ рдЕрдХреНрд╕рд░ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЧреИрд░-рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ PRNG рдХреЗ рдХрд╛рдо рдХреЛ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИ:

prng_state prng_init(SEEDTYPE seed[4]) {
  prng_state s;
  // тАж
  return s;
}

рд╣рдо рдЗрд╕ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд░рд╛рдЬреНрдп рдХреЗ рдкреВрд░реЗ рд╣рд┐рд╕реНрд╕реЗ (s0 рдпрд╛ s1) рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдзреЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╣рдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪреЗрдВрдЧреЗ, рдЬреЛ рдЧрд▓рддреА рд╕реЗ рдпрд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдПрдХ рдЬреНрдЮрд╛рдд рдХрдордЬреЛрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдХреЛ рдЬрдиреНрдо рджреЗрддреА рд╣реИред

рдЪреВрдВрдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдХрд╛ рдЖрдзрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо 128 рд╕реНрдерд┐рддрд┐ рдмрд┐рдЯреНрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВред рдРрд╕реА рдПрдиреНрдЯреНрд░рд╛рдкреА рдПрдХ рдордЬрдмреВрдд рд╕реНрдерд┐рддрд┐ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

s.state[0] = _mm256_set_epi64x(phi[3], phi[2] ^ seed[1], phi[1], phi[0] ^ seed[0]);
s.state[1] = _mm256_set_epi64x(phi[7], phi[6] ^ seed[3], phi[5], phi[4] ^ seed[2]);

рдлрд┐рд░ рд╣рдо ROUNDSрдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХреЛ рдХрдИ рдмрд╛рд░ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ :

  1. STEPSSHISHUA рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЪрд░рдг ( ) рдЪрд▓рд╛рдПрдБ ред
  2. рд╣рдо рд░рд╛рдЬреНрдп рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рджреВрд╕рд░реЗ рд░рд╛рдЬреНрдп рдХреЛ, рдФрд░ рджреВрд╕рд░реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред

for (char i = 0; i < ROUNDS; i++) {
  prng_gen(&s, buf, 4 * STEPS);
  s.state[0] = s.state[1];
  s.state[1] = s.output;
}

рдЖрдЙрдЯрдкреБрдЯ рдкрд░рд┐рдгрд╛рдо рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рд░рд╛рдЬреНрдп рдлреИрд▓рд╛рд╡ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдФрд░ рд╕рд╣рд╕рдВрдмрдВрдз рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдЪрд╛рд▓рди рдХреА рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдПрдХ рдмрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдлреИрд▓рд╛рд╡ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╣рд╕рдВрдмрдВрдз рдкрд░ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ STEPSрдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП 2 рдФрд░ ROUNDS10 рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ ред 10. рдореИрдВрдиреЗ PRRG рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рдЙрдкрдХрд░рдг рд╕реЗ рдкреНрд░реИрдХреНрдЯреНрд░реЗрдб рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ "рдЕрд╕рд╛рдорд╛рдиреНрдп" рдФрд░ "рд╕рдВрджрд┐рдЧреНрдз" рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рд╕рд╣рд╕рдВрдмрдВрдз рдХреА рдЧрдгрдирд╛ рдХреАред

рдкреНрд░рджрд░реНрд╢рди


рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЧрддрд┐ рдХреЛ рдорд╛рдкрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ:

  • рдШрдбрд╝реА рдорд╛рдк рдкрд░реНрдпрд╛рдкреНрдд рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • , , - , -, .
  • , . .
  • : , .

рдореИрдВ рдЖрд░рдбреАрд╕реАрдПрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдЪрдХреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред

рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдореЗрд░реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХреЗ, рдореИрдВ рдХреНрд▓рд╛рдЙрдб-рдЖрдзрд╛рд░рд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╕реНрдерд╛рдиреАрдп рдкрд░реАрдХреНрд╖рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕реНрддрд░ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдореЗрд░рд╛ рд╕рдорд╛рди рдХрдВрдкреНрдпреВрдЯрд░ рдЦрд░реАрджрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдХрдИ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдмрд╛рджрд▓реЛрдВ рдореЗрдВ PRNG рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ Google рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо N2 (Intel рдкреНрд░реЛрд╕реЗрд╕рд░) рдФрд░ N2D (AMD рдкреНрд░реЛрд╕реЗрд╕рд░) рдХреЛ рдЪреБрдирд╛ред рдЬреАрд╕реАрдкреА рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЗрдВрдЯреЗрд▓ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдПрдПрдордбреА рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рд╣реЛрдВрдЧреЗред

рд╡рд┐рд╖рдп рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдкреБрд░рд╛рдиреЗ RC4 рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред рдХрд╛рдо рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде, рдореБрдЭреЗ рдорд┐рд▓ рдЧрдпрд╛7.5 рд╕реАрдкреАрдмреА (рдЪрдХреНрд░ рдкреНрд░рддрд┐ рдЙрддреНрдкрдиреНрди рдмрд╛рдЗрдЯ)ред

рдЕрдм рдЪрд▓реЛ рдПрдХ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рддреЗрдЬрд╝ рдПрдорд╕реАрдЬреА рдЪрд▓рд╛рддреЗ рд╣реИрдВ: рд╕рдмрд╕реЗ рд╕рд░рд▓ рд▓реЗрд╣рдорд░128 рдкреАрдЖрд░рдПрдирдЬреА , рдЬреЛ рдмрд┐рдЧ рдХреНрд░рд╢ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, 0.5 рд╕реАрдкреАрдмреА рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рд╡рд╛рд╣ рдорд╣рд╛рди!

рдлрд┐рд░ рд╣рдо рдирд╡реАрдирддрдо рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЪрд▓рд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддреЗрдЬ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡реАрд░рдВрдб ред 0.41 рд╕реАрдкреАрдмреА , рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░!

рдХреБрдЫ PRSP 32-рдЯреЗрд░рд╛рдмрд╛рдЗрдЯ рдкреНрд░реИрдХреНрдЯреНрд░реЗрдб рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдмрд╣реБрдд рдЬрд▓реНрджреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред Xoshiro256 + рдХреЗрд╡рд▓ 512 mebibytes рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪреНрдЪ рдЧрддрд┐ рджрд┐рдЦрд╛рдпрд╛: 0.34 cpb ред RomuTrio

рдХрд╛ рдПрдХ рдФрд░ рд╣рд╛рд▓рд┐рдпрд╛ рд╡рд┐рдХрд╛рд╕ ред рд╡рд╣ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рддреЗрдЬ PRNG - 0.31 cpb рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддреА рд╣реИред

рдареАрдХ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рд╣реИред рд╕реЗрдореА-рд╢рд┐рд╢реБрдЖ рдиреЗ рдХреНрдпрд╛ рджрд┐рдЦрд╛рдпрд╛?

0.14 CPB ред рджреЛ рдмрд╛рд░ рдЬрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рд░реЛрдореБрддреНрд░рд┐рдпреЛред


рдардВрдбрд╛ред рдЕрдм рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдЬрдирд░реЗрдЯрд░ ChaCha8 рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рд╡рд╣ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ ... 0.12 CPB ред

рдУрд╣ред

SIMD рдЕрд╕рд▓реА рдЬрд╛рджреВ рд╣реИ!

рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рдерд╛ ред ChaCha8 рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдмрдирд╛рдирд╛ рдмреЗрд╣рдж рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдПрдХ рд╡рд┐рд╕рд░рд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реИрд╢реЗрдб рдХрд╛рдЙрдВрдЯрд░ рд╣реИред

рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ рдЬреВрд▓рд┐рдпрд╛ рднрд╛рд╖рд╛ рдХреА рдЯреАрдо рдиреЗ рддреЗрдЬреА рд╕реЗ SIMD рдЖрдзрд╛рд░рд┐рдд PRNG рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Vigny рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдереА? рдЖрдЗрдП рдЗрд╕ рддрдХрдиреАрдХ ( Xoshiro256 + рдХреЗ 8 рдЯреБрдХрдбрд╝реЗ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ ред 0.09 рд╕реАрдкреАрдмреА !

рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдореЗрд░рд╛ рд▓реИрдкрдЯреЙрдк рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдЯреАрдо рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЬреАрд╕реАрдкреА рдореЗрдВ рдЪрд╛рдЪрд╛ 8 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬ рдХреНрдпреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рдзреАрдорд╛ред рдореЗрд░реА рдорд╢реАрди рдкрд░, рдЬреВрд▓рд┐рдпрд╛ рдЯреАрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд░реНрдз-рд╢реАрд╢реВ рддреЗрдЬреА рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд╛рдЪрд╛ 8 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛ рд╣реИред

рд╕рднреА рдкреНрд░рддрд┐рдпреЛрдЧрд┐рдпреЛрдВ рдХреЛ рд╣рд░рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдЕрд░реНрдз-рд╢рд┐рд╢реБрдЖ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреНрдпреЛрдВ рдХрд╣рд╛? рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рд╕реЗрдореА-рд╢реАрд╢реВ рдХреА рджреЛ рдкреНрд░рддрд┐рдпрд╛рдБ рдЪрд▓рд╛рдИрдВ рддреЛ рдЧрддрд┐ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред

рдЬреВрд▓рд┐рдпрд╛ рдХрдорд╛рдВрдб рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рдорд╛рди, рд╣рдо рдЕрд▓рдЧ рд╕реЗ рджреЛ PRNG (рдПрдХ 256-рдмрд┐рдЯ рд╕реНрдЯреЗрдЯ рдХреЗ рдЪрд╛рд░ рдмреНрд▓реЙрдХ) рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЕрдзрд┐рдХ рд░рд╛рдЬреНрдп рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдФрд░ рднреА рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЪрд╛рд░ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

o0 = _mm256_xor_si256(u0, t1);
o1 = _mm256_xor_si256(u2, t3);
o2 = _mm256_xor_si256(s0, s3);
o3 = _mm256_xor_si256(s2, s1);

рддреЛ рд╣рдореЗрдВ SHISHUA рдорд┐рд▓рд╛, рдЬрд┐рд╕рдореЗрдВ 0.06 cpb рдХреА рдЧрддрд┐ рджрд┐рдЦрд╛рдИ рдЧрдИ ред

рдпрд╣ рджреБрдирд┐рдпрд╛ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдмрд╕реЗ рддреЗрдЬ рдкреНрд░рддрд┐рдпреЛрдЧреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛрдЧреБрдирд╛ рд╣реИ, рдЬрд┐рд╕рдиреЗ 32-рдЯреЗрд░рд╛рдмрд╛рдЗрдЯ рдкреНрд░реИрдХреНрдЯреНрд░реИрдВрдб рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рдХрд┐рдпрд╛ред рдирддреАрдЬрд╛ рдЧреНрд░рд╛рдл рдкрд░ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдирд┐рдХрд▓рд╛ред рдпрд╣ рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рднреА рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - 0.03 рд╕реАрдкреАрдмреА, рд▓реЗрдХрд┐рди рдореИрдВ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реВрдВрдЧрд╛ред

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреБрдЫ рдФрд░ рд╣рдлреНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдЬрдирд░реЗрдЯрд░ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рдмрд╕реЗ рддреЗрдЬ рдкреЛрдбрд┐рдпрдо рдкрд░ рд░рд╣реЗрдЧрд╛ (рдХреГрдкрдпрд╛ рдРрд╕рд╛ рдХрд░реЗрдВ)ред

рдЧреБрдгрд╡рддреНрддрд╛


рдЬрдирд░реЗрдЯрд░ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдмрд┐рдЧ рдХреНрд░рд╢ рдФрд░ 32-рдЯреЗрд░рд╛рдмрд╛рдЗрдЯ рдкреНрд░реИрдХреНрдЯреНрд░реИрдВрдб рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╕рднреА рдЪрд╛рд░ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдиреБрдХрд╕рд╛рди рдореЗрдВ рдЗрд╕рдХреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ ред рдЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ 4 рдмрд┐рдЯ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдХрдо рдХрд░рдХреЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ s0 = [a, b]рдФрд░ s1 = [c, d]ред рдПрдХ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде, рд╣рдо [0, a]рдФрд░ [0, d], рдФрд░ рд╕рд░рдЧрд░реНрдореА рдХреЗ рд╕рд╛рде, [b, c]рдФрд░ [d, a]ред рдирдИ s0рдмрд░рд╛рдмрд░реА [b, c] + [0, a] = [bтКХ(aтИзc), aтКХc], рд▓реЗрдХрд┐рди s1рдмрд░рд╛рдмрд░реА [d, a] + [0, c] = [dтКХ(aтИзc), aтКХc]ред рдпрджрд┐ a = ┬мc, рддрдм, aтКХc = 1рдФрд░ aтИзc = 0рдЗрд╕рд▓рд┐рдП, s0 = [b, 1]рдФрд░ s1 = [d, 1]ред рд╣реИ, рд╣рдо рдореЗрдВ рд╕реЗ рджреЛ рдХреЗ рд╕рдВрдпреЛрдЬрди рдкрд╛рдиреЗ aрдФрд░ cрд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ рд╣реА рдЕрдВрддрд┐рдо рдЕрд╡рд╕реНрдерд╛ рджреЗред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 64-рдмрд┐рдЯ рдХрд╛рдЙрдВрдЯрд░ рднреА рд░рд╛рдЬреНрдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдпрд╣ 2 71 рдХрд╛ рдиреНрдпреВрдирддрдо рдЪрдХреНрд░ рдирд┐рдХрд▓рд╛рдмрд╛рдЗрдЯреНрд╕ (рдкреНрд░рддрд┐ рд░рд╛рдЬреНрдп рд╕рдВрдХреНрд░рдордг рдореЗрдВ 128 рдмрд╛рдЗрдЯреНрд╕), рдЬреЛ 10 рдЧреАрдмрд╛рдЗрдЯреНрд╕ / рд╕реЗрдХрдВрдб рдХреА рдЧрддрд┐ рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рд╕рд╛рдд рд╣рдЬрд╛рд░ рд╕рд╛рд▓ рдЪрд▓реЗрдЧрд╛ред рдпрд╣ рдЦреЛрдП рд╣реБрдП рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдФрд╕рдд рд╕рдВрдХреНрд░рдордг рдЕрд╡рдзрд┐ 2 ^ ((256 + 1)) 2) рд╣реИред рдпрд╣ 2,135 рдмрд╛рдЗрдЯреНрд╕ (10 рдЧреАрдмрд╛рдЗрдЯреНрд╕ / рд╕реЗрдХрдВрдб рдХреА рдЧрддрд┐ рдкрд░) рдХрд╛ рдФрд╕рдд рдЪрдХреНрд░ рджреЗрддрд╛ рд╣реИ ред рдпрд╣ рдмреНрд░рд╣реНрдорд╛рдВрдб рдХреЗ рдореМрдЬреВрдж рд░рд╣рдиреЗ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдПрдХ рдЦрд░рдм рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдЪрд▓реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдордзреНрдп рдЪрдХреНрд░ рдХреЛ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╣рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдмрддрд╛рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:

рдЬрдирдХрдкреНрд░рджрд░реНрд╢рдирдЧреБрдгрд╡рддреНрддрд╛рдмреАрдЬ рдХрд╛ рд╕рдВрдмрдВрдз
SHISHUA0.06> 32 рдЯреАрдЖрдИрдмреА> 256 рдЬреА.рдмреА.
xoshiro256 + x80.091 рдХреАрдмреА0 рдХреАрдмреА
ChaCha80.12> 32 рдЯреАрдЖрдИрдмреА?> 32 рдЯреАрдЖрдИрдмреА?
RomuTrio0.31> 32 рдЯреАрдЖрдИрдмреА1 рдХреАрдмреА
xoshiro256 +0.34512 рдорд┐.рдмреА.1 рдХреАрдмреА
wyrand0.41> 32 рдЯреАрдЖрдИрдмреА8 рдХреАрдмреА
Lehmer1280.44> 32 рдЯреАрдЖрдИрдмреА1 рдХреАрдмреА
RC47.481 рдЯреАрдЖрдИрдмреА1 рдХреАрдмреА

  1. рдкреНрд░рджрд░реНрд╢рди : рдПрдХ рдЙрддреНрдкрдиреНрди рдмрд╛рдЗрдЯ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрдХреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдХреНрд▓рд╛рдЙрдб рдорд╢реАрдиреЛрдВ рдПрди 2 рдЬреАрд╕реАрдкреА рдФрд░ рдПрди 2 рдбреА (рдПрдПрдордбреА) рдкрд░ рдкреНрд░рд╛рдкреНрдд, рдСрд░реНрдбрд░ рд╕рдорд╛рди рд╣реИред
  2. рдЧреБрдгрд╡рддреНрддрд╛ : рдЬрдирд░реЗрдЯрд░ рдЬрд┐рд╕ рд╕реНрддрд░ рдкрд░ рдкреНрд░реИрдХреНрдЯреНрд░реЗрдб рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ> рд╕рдВрдХреЗрдд рд╣реИред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рд┐рджреНрдз рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди рд╣реИред
  3. рдмреАрдЬ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╣рд╕рдВрдмрдВрдз : рдмреАрдЬ рд╕рдВрдЦреНрдпрд╛ 0, 1, 2, 4, 8, 16, 32, 64 рдХреЗ рд╕рд╛рде рдЖрда рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░реИрдХреНрдЯреНрд░реИрдВрдб рдЯреНрд░рд╛рд╡рд▓ред рд╣рдо рдбрдмрд▓ рд░рд┐рдбрдХреНрд╢рди рдФрд░ рдЙрдиреНрдирдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реИрдХреНрдЯреНрд░реИрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред



рдЖрдЧреЗ рдХреА


рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рд╣рдо SHISHUA рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЖрджрд░реНрд╢ PRNG рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реИрдВ:

  1. , 21024. 10 /. 10282 , . ┬л┬╗ ( ). , . , 128- NEON ARM? , , .
  2. . , SHISHUA XOR . , .
  3. , 2128 ( ). SHISHUA, , . , ( ) (, , . 2).
  4. рд░рд╛рдЬреНрдп рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдкреВрд░реНрдг рдлреИрд▓рд╛рд╡ рд╣реЛрддрд╛ рд╣реИ : рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рднреА рдмрд┐рдЯреНрд╕ рд░рд╛рдЬреНрдп рдХреЗ рд╕рднреА рдмрд┐рдЯреНрд╕ рдХреЛ рд╕рдорд╛рди рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рд╢рд┐рд╢реБрдкрд╛рд▓ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

PRNGs рдФрд░ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмреЗрд╣рддрд░ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд▓реЗ рд╕рд╛рдзрдиреЛрдВ рдХреА рдХрдореА рд╣реИред рдореБрдЭреЗ рдПрдХ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рддреБрд░рдВрдд рдореБрдЭреЗ рд╕рдЯреАрдХ рдорд╛рдк рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХреЗ рддрд╛рдХрд┐ рдореИрдВ рдордХреНрдЦреА рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХреВрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкрд╣рд▓реЗ рдерд╛, рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░реИрдХреНрдЯреНрд░реИрдВрдб рдорд╣рд╛рди рд╣реИ:

  • рдпрд╣ рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдХрд╣рдирд╛ рд╣реИ: "рдареАрдХ рд╣реИ, 32 рдЯреЗрд░рд╛рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдХреЛрдИ рд╡рд┐рд╕рдВрдЧрддрд┐ рдирд╣реАрдВ рд╣реИ ..."
  • рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдХрдИ рд╕рдкреНрддрд╛рд╣ рд▓рдЧрддреЗ рд╣реИрдВ ...

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд▓реНрдж рд╣реА рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред

All Articles