Как стать автором
Обновить
427.02
Альфа-Банк
Лучший мобильный банк по версии Markswebb

Сгенерировать 100 млн случайных строк менее чем за минуту

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров6.7K

Зачастую в программисткой практике необходимо нагенерировать множество случайных строк. Либо для тестового примера, либо как источник обезличивания, либо просто, чтобы наполнить разработческую БД. Задача, в принципе, понятная и легкая для любого уровня программиста. Но если это нужно сделать быстро, например, если набор случайных строк нужен здесь и сейчас, то можно использовать предлагаемое решение. Строки получаются разной длины, со 100%-ной хаотичностью (полностью несортированные). Выглядят эти строки вот так (спойлер):

Скрытый текст

92fmUw0+0eLE71rw/v3oRrQhMC13Wn13xwI3irx8g/br4sa2viHHkgfN0CauOTILV
DsqCACqg3Ovgdm7aPhkeEzR7pDAb1iOZ+H1YRWFKMOwP+05P5
ivzUR4Xr8bf4dsZJ1eKegv66U/ZmX6AtoU7clmxtMdsYLGFz/OAnHspvPDIFKk+gLLO6g8I+l50
Y9/IfrOrJXVqM7qCrpDUNYos5s60Ytg1smoms
8fXbwDJBacppg/nL2nXMm30dSkve
iadlICPj9XO7fVP3Pgz07oF8jTeIdkxdYzOLTP/wvBDRPbf+nk4PXIeAwkO
/CO/Nl/TW/4qjiq
udaFbaEf/1WaJv1tVKhJ29qZezZzw9pal3O
4cL+Fwp5usrOtQbzrV2YdyItGSu9sCHI373Gn2Dwa4nCyHiWGhZW6aN0MAjqz25NBPI6IG1B8Uv
XqUlJRdUzA47+FrOrgOYkbgZ4e06
QmTrgyhW9Z3acH8HiDpik2gW1jq7
7IGB1u2e
wK
qBKf8s
ZOTSvR7dTkar0aPkGdysGWO5cwnSsLe487DR1FGFDofyXFr8zGsd6m60NBA3khHu1
ZyTi7TujA
WZnugfmJOu0OgiSO2q29SdJlrolYV/g
i+c6P2107ISNXngrL
jOusrKAjxyLLu07vY931
RE4jWmwl1yqyHe16UZlA3S72SRSSz2IZKCes9DWw
H3Gd7iz+zu6pPzzKEbAt5vC9
nn
RFbx38
EmfkliXQJD1laIZECkR3dTNU4E5DgAJq6IFc2LI6pLbQR2uk
v3z9n+8p9CqCElMKJimy8VtYuy/GQnI6ugv0vCM1eQvL0G1GJu
elL9gWFkeOEJJdN95ck965OgWWylejrn/YPB
Ytxj7pK2KnmE5SCy7qTECNQTZOBP2YrM04U4vlrbDL3IwULJgT2
AEUZPfa9T8QFHj60HptfQt/i0QaK
7rb9uJUBYayKZTimZiluyskatbE1+7
crS/+bxR3/OcwQDBAOkDqkvzzIPrdO0MgkkKjGBVRntAi5vHgxNNx+7jA45TbXVuqUQuyt+xah
J1N5jm0mS
dV5Nzne34xFzuC+BELGSKMJh7rtPdc9a+iQKNEiKin
b+y+hdF9qVvD9Kdu/ca9JKeSMK/11Hxm6sFxIk1EKVP5MTK/xSkzi0Xq8BcQSdAQFD5PxFg7TeqZgXhwG
nZFuYMgv7MPtzKTstgO4Vt2rs6fpjI52Co1rXExO1WK
5s6OYiOKm7JXAELOTchbpq
l6OI19uncCf4szXtz
/BPvAM7xSihcYOhpkwHu6YTYjD7LbDbqFjKdw0b6yfPr5wMxsm5u7P4KcL5js8V7VMEUjLwJpANke+PMrn
A9
4YNR7iD7ocFYrxXqnjR0HtYL0AA8lXOothgWI
pqfGlf0tHv+hlCSHGzwJ6QRFZStSh+2I
7ZawvtS4kWh51qlC7Tsgsk1fmPVFP7nTa8PfeKNi/sE8lygnZNjeXEwmiboS0T2dj5RmaluW4+
WqutDV
fdbS6gnspyrP1lijyX/GUKy+HHmtdJjw8Is3OpjDM2zrXvoHJOZGt6zHdG2gLrMbX
qqT4WfALNnDW80p8
7PDy0hmEUtSjHtbMvZu8JgPxKmCRuW//qBIKI+b+ftAnXzAW1QHHzmVZKXK3qXC8Aeh/R5MyJCBUzi5
kHHv70Z4pHdjH9CptqJRRBQWTt
CoL1LrZDFt+y/2EczS69vlh2UxmYg+PyzeIOZlOSAkgNCiiAT5z2z+oQV+3xqw8t94vA5hUkq
tGiooR7ka6zGuGOnC8P9
AEyMpnk5BB
g4h4/gu6WcJBdHhr7orPJjWiY4mFHkkART4H7
WsBwQFEGTH71bKepdaQiNsUO/mW1spSVDfVL2ItxL+wWkJh42zc2t
Ca8lqLTs6raRw8M1DacjdPH21pB2fq9i4XynS
RVdt2N7DSI+
I9WfBQTig0V8t0nMT1VzMKngJu52vdszOV1WSRV
irMsl
+9zcwBO6aU9cMZ2xERMWAqhP8jQbGT
C3b1mEoBIQfSO/zi7BmRh5Yd7HrriJ
Ce9gj8ZDpjz85y8+jXR1flDxSfSAk2hXW4nM07DrHBfGSnbbYzrpTL1JxFMyu6rqWy7/jNaToJFLZI69JrWl
K0jTGQQGlCG3kwkPBCD9/sFofmEHzZ6OhuqgtjWQQibLLI/ow9Gc0WrMr1
6FEXYshDg/CtryRwiqA3Xm6zTR
6OZRpE
l2cHZNvDTuHKq3CHgTAUxxAv/8vLkvCaCNBSOwYMx1Zvt18Qjf41scRSgu1IsOl6vljtk686I2zO9P
3hD3WEGThQdVzHIK4/e4aY3uFAJCqX9jhbe/EBr8tvaqZRDn/408bOtntUD8hGS8mR4RuPvHlHaUXZ0
xiSvhHya/YcAMc3u0JSrTaCS+zou5H/J1UgIvAHnttL8CxSR+EoKt0su3WYjx+5MtrnDyLAtMt7jisqHV5Rb7g
hKgtfxuFmA9rSZFZ4yI/dJPHZRpeCIslgSlaGVPQ6/LRo/RLnkLQaH3Qsds
SPsX12TE4vVEWb1PTzuzZ+JMVoS9wB+P+lbBS80ptpYPgg4v00LBBN8yOfNF8eKBACfjROJiUJ4AzI3UGfFeI
iLBMv85FMTMQcvxnNcj7f/JN0HUZ6DuAVrhrVoow
KwhvfvqRSRsWHq2A8z/59xAJcPzzA+VzOnuxUUD/1lHJk2d
jZKMaifMc3MacU9jqR+PYs0n07d6
TQIEkq33MI
UyvkSM0LiOcVDFUSMgfrJBEvrH6
atTMiuWdNXMG3MOCEqCfeoe+c8/VGMUJN6O3+TzXzVnOH/cRV9O/5zwhaj7OFGHpm8thO34I2UHABss3OO
LPtWTmAGT
IW9elzSUoN+pQkjM/W6UTBgWdf8sTxACMBzQQSFrIMwS
e6LNWdEqVk6TlgDifSxBavXAUqUTWBq7P8jYWweXx1DfUGy
pFqXPIKukbtti0BpKxj9zS9Nx7llcy5wENTNUJnnp6D3zJfq582
096diruMhFtAkjd
3/cARuT5Air++ijS3a35Tp1Cvp4qK3J5Z75uV7IMkuH6lGpVm/+DMaa2V7W9nuMsE5VuA7y
FflWDbDlcD/bBTofskxsUfPujCHv6gCfINzMBSzSvq4uYqUvBURV7pXdreVis8OQvXpPVWzWrjTO66mDPnO
ZhnhPpC5qIK3nNvGEWLf0X0LuNKlVr1QEW5/uhOWWQSKZiLT6EqsYqSqXGGdZ+8tlqoF
8GIV24vGJ77Jglj+q8iF5R05mjC1huojq+U3WSAcEw8zvs0sEYK40HNEr4cG4CEMVWYJ12v
FhhnzeRQa7S9vkwmQkG1REAtTyg2TFkkzpbIPj8m2m0oufB8KA6bnBtnWTx
Up82M1q0Su57vZglvqKhe0ZdNlLRcAprrJrWd3SVVb8xsPhd1nS4ADSKykjWtnrQesOAsMEGB5GFkh56C
TEBUaQK063VLPgnh/Lh
THVxwaQ/L4NAL3Lu/0mpf4fhuvdyeP8yX4C4ZzOtUwqhlB3l7lWMKhsIKHu5QiYKlI5Oc09n
lorcigrhM6ImmGzSZBeVP2+9L6nrdvATq30kF6CcZGM4QTsY
8qbESKNeNVuluv0w9lwGxhA3bKHMOFiqjhYRH4KI3ZbooCD
tISGqpGEJgB3909Z+0hHYsUSfWjbPgDEDF6fIANp5TKZGPscJ
1JTlgcnPly8UYZ+ugZmqqwVAzk4+/Lch4MRsvqVjafBogitzj6vEXP+gfHZivpc4LK
jg2DNCfPfFL1Y7qbm34Fz0y
OH68CvNt3rw3U7niP+smj2goEXGIO631cdLO8TnCqt2nkqnQdqjrKcQzW0cwmbmvNAxpb2mNhG
8GKdicvFizZ9AfdKYlttzxft884d9nizIi6nj/SW5nM2s5ql/MtheICFY1HwUjBfw1IiQLwtVR/E8FbE8J2ebw=

............................................................

Вот код на C#, проверялся для .NET8 на Windows 10, компилировался на Visual Studio 2022. Как уже упоминалось, для генерации 100 млн. строк уходит менее минуты на обычном домашнем PC, а точнее 41 секунда:

    private static string[] RandomStrings(int count)
    {
        Random rand = Random.Shared;
        ConcurrentBag<string> bag = [];
        Parallel.ForEach(Enumerable.Range(1, count), num =>
        {
            string str = Convert.ToBase64String(SHA512.HashData(Guid.NewGuid().ToByteArray()));
            bag.Add(str[..(1 + rand.Next(str.Length - 1))]);
        });
        return [.. bag];
    }

результат:

полученный массив можно дальше использовать по назначению, а если сохранить в файл, то он будет весить в районе 4Гб.

Объяснение алгоритма

Скорость алгоритма объясняется генерацией не символов, а сразу набором байт, и, разумеется, в распараллеливании.

В параллелях генерируются GUIDы, что дает уникальность. Далее этот массив байт подвергается криптохэшированию, что дает полную непохожесть наборов байт (а исходные GUIDы похожи друг на друга, хоть и отличаются). Полученный набор байт переводится в строки, используя base64-кодирование. (Кодирование base64 использовалось только потому, что в моей задаче необходим был такой набор символов. Но ничто не мешает переводить байты в строки любым удобным способом). Затем строки по псевдослучайному числу обрезаются (Random только для этого используется), чтобы строки были разной длины. До обрезания строки абсолютно уникальные. Но после обрезания некоторые короткие строки становятся одинаковыми. Это нужно иметь ввиду, если уникальность важна. Сгенерированные строки сохраняются в потокобезопасную коллекцию, а по завершении генерации копируются в результирующий массив.

Необходимые пространства имен для работы алгоритма (спойлер):

Скрытый текст

using System.Security.Cryptography;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading.Tasks;

Рад буду узнать, что это кому-нибудь пригодилось. Если нужно изменить код под ранние версии C#, намекните в комментарии.


Подписывайтесь на Телеграм-канал Alfa Digital — там мы постим новости, опросы, видео с митапов, краткие выжимки из статей, иногда шутим.

Теги:
Хабы:
+31
Комментарии48

Полезные ссылки

Работа продуктовым дизайнером в бигтехе — тупик карьеры?

Время на прочтение9 мин
Количество просмотров1.4K
Всего голосов 22: ↑21 и ↓1+22
Комментарии1

Найм дизайнеров глазами лида

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров4.8K
Всего голосов 20: ↑20 и ↓0+23
Комментарии3

Дебаг на максимум: секретные настройки Xcode, которые должен знать каждый разработчик

Уровень сложностиСложный
Время на прочтение11 мин
Количество просмотров4.5K
Всего голосов 19: ↑17 и ↓2+17
Комментарии4

Модели Take-Rate: погружение в бизнес-процессы для успешного ценообразования

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров1.2K
Всего голосов 14: ↑13 и ↓1+13
Комментарии0

Хакатон «Цифровой прорыв»: как команда валидации Альфа-Банка разработала решение для РЖД

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров1.2K
Всего голосов 12: ↑12 и ↓0+13
Комментарии8

Информация

Сайт
digital.alfabank.ru
Дата регистрации
Дата основания
1990
Численность
свыше 10 000 человек
Местоположение
Россия