use std::thread::sleep; use std::time::Duration; use std::{ sync::{ atomic::{AtomicUsize, Ordering}, Arc, }, time::Instant, }; use rand::{random, rngs::OsRng, seq::SliceRandom}; use rayon::prelude::{IntoParallelIterator, ParallelIterator}; use scc::HashSet; use abineo_analytics_collector::hash::Hasher; const TIMEZONE: [&str; 427] = [ "Africa/Abidjan", "Africa/Accra", "Africa/Addis_Ababa", "Africa/Algiers", "Africa/Asmara", "Africa/Bamako", "Africa/Bangui", "Africa/Banjul", "Africa/Bissau", "Africa/Blantyre", "Africa/Brazzaville", "Africa/Bujumbura", "Africa/Cairo", "Africa/Casablanca", "Africa/Ceuta", "Africa/Conakry", "Africa/Dakar", "Africa/Dar_es_Salaam", "Africa/Djibouti", "Africa/Douala", "Africa/El_Aaiun", "Africa/Freetown", "Africa/Gaborone", "Africa/Harare", "Africa/Johannesburg", "Africa/Juba", "Africa/Kampala", "Africa/Khartoum", "Africa/Kigali", "Africa/Kinshasa", "Africa/Lagos", "Africa/Libreville", "Africa/Lome", "Africa/Luanda", "Africa/Lubumbashi", "Africa/Lusaka", "Africa/Malabo", "Africa/Maputo", "Africa/Maseru", "Africa/Mbabane", "Africa/Mogadishu", "Africa/Monrovia", "Africa/Nairobi", "Africa/Ndjamena", "Africa/Niamey", "Africa/Nouakchott", "Africa/Ouagadougou", "Africa/Porto-Novo", "Africa/Sao_Tome", "Africa/Tripoli", "Africa/Tunis", "Africa/Windhoek", "America/Adak", "America/Anchorage", "America/Anguilla", "America/Antigua", "America/Araguaina", "America/Argentina/Buenos_Aires", "America/Argentina/Catamarca", "America/Argentina/Cordoba", "America/Argentina/Jujuy", "America/Argentina/La_Rioja", "America/Argentina/Mendoza", "America/Argentina/Rio_Gallegos", "America/Argentina/Salta", "America/Argentina/San_Juan", "America/Argentina/San_Luis", "America/Argentina/Tucuman", "America/Argentina/Ushuaia", "America/Aruba", "America/Asuncion", "America/Atikokan", "America/Bahia_Banderas", "America/Bahia", "America/Barbados", "America/Belem", "America/Belize", "America/Blanc-Sablon", "America/Boa_Vista", "America/Bogota", "America/Boise", "America/Cambridge_Bay", "America/Campo_Grande", "America/Cancun", "America/Caracas", "America/Cayenne", "America/Cayman", "America/Chicago", "America/Chihuahua", "America/Costa_Rica", "America/Creston", "America/Cuiaba", "America/Curacao", "America/Danmarkshavn", "America/Dawson_Creek", "America/Dawson", "America/Denver", "America/Detroit", "America/Dominica", "America/Edmonton", "America/Eirunepe", "America/El_Salvador", "America/Fort_Nelson", "America/Fortaleza", "America/Glace_Bay", "America/Godthab", "America/Goose_Bay", "America/Grand_Turk", "America/Grenada", "America/Guadeloupe", "America/Guatemala", "America/Guayaquil", "America/Guyana", "America/Halifax", "America/Havana", "America/Hermosillo", "America/Indiana/Indianapolis", "America/Indiana/Knox", "America/Indiana/Marengo", "America/Indiana/Petersburg", "America/Indiana/Tell_City", "America/Indiana/Vevay", "America/Indiana/Vincennes", "America/Indiana/Winamac", "America/Inuvik", "America/Iqaluit", "America/Jamaica", "America/Juneau", "America/Kentucky/Louisville", "America/Kentucky/Monticello", "America/Kralendijk", "America/La_Paz", "America/Lima", "America/Los_Angeles", "America/Lower_Princes", "America/Maceio", "America/Managua", "America/Manaus", "America/Marigot", "America/Martinique", "America/Matamoros", "America/Mazatlan", "America/Menominee", "America/Merida", "America/Metlakatla", "America/Mexico_City", "America/Miquelon", "America/Moncton", "America/Monterrey", "America/Montevideo", "America/Montserrat", "America/Nassau", "America/New_York", "America/Nipigon", "America/Nome", "America/Noronha", "America/North_Dakota/Beulah", "America/North_Dakota/Center", "America/North_Dakota/New_Salem", "America/Ojinaga", "America/Panama", "America/Pangnirtung", "America/Paramaribo", "America/Phoenix", "America/Port_of_Spain", "America/Port-au-Prince", "America/Porto_Velho", "America/Puerto_Rico", "America/Punta_Arenas", "America/Rainy_River", "America/Rankin_Inlet", "America/Recife", "America/Regina", "America/Resolute", "America/Rio_Branco", "America/Santarem", "America/Santiago", "America/Santo_Domingo", "America/Sao_Paulo", "America/Scoresbysund", "America/Sitka", "America/St_Barthelemy", "America/St_Johns", "America/St_Kitts", "America/St_Lucia", "America/St_Thomas", "America/St_Vincent", "America/Swift_Current", "America/Tegucigalpa", "America/Thule", "America/Thunder_Bay", "America/Tijuana", "America/Toronto", "America/Tortola", "America/Vancouver", "America/Whitehorse", "America/Winnipeg", "America/Yakutat", "America/Yellowknife", "Antarctica/Casey", "Antarctica/Davis", "Antarctica/DumontDUrville", "Antarctica/Macquarie", "Antarctica/Mawson", "Antarctica/McMurdo", "Antarctica/Palmer", "Antarctica/Rothera", "Antarctica/Syowa", "Antarctica/Troll", "Antarctica/Vostok", "Arctic/Longyearbyen", "Asia/Aden", "Asia/Almaty", "Asia/Amman", "Asia/Anadyr", "Asia/Aqtau", "Asia/Aqtobe", "Asia/Ashgabat", "Asia/Atyrau", "Asia/Baghdad", "Asia/Bahrain", "Asia/Baku", "Asia/Bangkok", "Asia/Barnaul", "Asia/Beirut", "Asia/Bishkek", "Asia/Brunei", "Asia/Chita", "Asia/Choibalsan", "Asia/Colombo", "Asia/Damascus", "Asia/Dhaka", "Asia/Dili", "Asia/Dubai", "Asia/Dushanbe", "Asia/Famagusta", "Asia/Gaza", "Asia/Hebron", "Asia/Ho_Chi_Minh", "Asia/Hong_Kong", "Asia/Hovd", "Asia/Irkutsk", "Asia/Jakarta", "Asia/Jayapura", "Asia/Jerusalem", "Asia/Kabul", "Asia/Kamchatka", "Asia/Karachi", "Asia/Kathmandu", "Asia/Katmandu", "Asia/Khandyga", "Asia/Kolkata", "Asia/Calcutta", "Asia/Krasnoyarsk", "Asia/Kuala_Lumpur", "Asia/Kuching", "Asia/Kuwait", "Asia/Macau", "Asia/Magadan", "Asia/Makassar", "Asia/Manila", "Asia/Muscat", "Asia/Nicosia", "Asia/Novokuznetsk", "Asia/Novosibirsk", "Asia/Omsk", "Asia/Oral", "Asia/Phnom_Penh", "Asia/Pontianak", "Asia/Pyongyang", "Asia/Qatar", "Asia/Qostanay", "Asia/Qyzylorda", "Asia/Riyadh", "Asia/Sakhalin", "Asia/Samarkand", "Asia/Seoul", "Asia/Shanghai", "Asia/Singapore", "Asia/Srednekolymsk", "Asia/Taipei", "Asia/Tashkent", "Asia/Tbilisi", "Asia/Tehran", "Asia/Thimphu", "Asia/Tokyo", "Asia/Tomsk", "Asia/Ulaanbaatar", "Asia/Urumqi", "Asia/Ust-Nera", "Asia/Vientiane", "Asia/Vladivostok", "Asia/Yakutsk", "Asia/Yangon", "Asia/Yekaterinburg", "Asia/Yerevan", "Atlantic/Azores", "Atlantic/Bermuda", "Atlantic/Canary", "Atlantic/Cape_Verde", "Atlantic/Faroe", "Atlantic/Madeira", "Atlantic/Reykjavik", "Atlantic/South_Georgia", "Atlantic/St_Helena", "Atlantic/Stanley", "Australia/Adelaide", "Australia/Brisbane", "Australia/Broken_Hill", "Australia/Currie", "Australia/Darwin", "Australia/Eucla", "Australia/Hobart", "Australia/Lindeman", "Australia/Lord_Howe", "Australia/Melbourne", "Australia/Perth", "Australia/Sydney", "Europe/Amsterdam", "Europe/Andorra", "Europe/Astrakhan", "Europe/Athens", "Europe/Belgrade", "Europe/Berlin", "Europe/Bratislava", "Europe/Brussels", "Europe/Bucharest", "Europe/Budapest", "Europe/Busingen", "Europe/Chisinau", "Europe/Copenhagen", "Europe/Dublin", "Europe/Gibraltar", "Europe/Guernsey", "Europe/Helsinki", "Europe/Isle_of_Man", "Europe/Istanbul", "Europe/Jersey", "Europe/Kaliningrad", "Europe/Kiev", "Europe/Kirov", "Europe/Lisbon", "Europe/Ljubljana", "Europe/London", "Europe/Luxembourg", "Europe/Madrid", "Europe/Malta", "Europe/Mariehamn", "Europe/Minsk", "Europe/Monaco", "Europe/Moscow", "Europe/Oslo", "Europe/Paris", "Europe/Podgorica", "Europe/Prague", "Europe/Riga", "Europe/Rome", "Europe/Samara", "Europe/San_Marino", "Europe/Sarajevo", "Europe/Saratov", "Europe/Simferopol", "Europe/Skopje", "Europe/Sofia", "Europe/Stockholm", "Europe/Tallinn", "Europe/Tirane", "Europe/Ulyanovsk", "Europe/Uzhgorod", "Europe/Vaduz", "Europe/Vatican", "Europe/Vienna", "Europe/Vilnius", "Europe/Volgograd", "Europe/Warsaw", "Europe/Zagreb", "Europe/Zaporozhye", "Europe/Zurich", "Indian/Antananarivo", "Indian/Chagos", "Indian/Christmas", "Indian/Cocos", "Indian/Comoro", "Indian/Kerguelen", "Indian/Mahe", "Indian/Maldives", "Indian/Mauritius", "Indian/Mayotte", "Indian/Reunion", "Pacific/Apia", "Pacific/Auckland", "Pacific/Bougainville", "Pacific/Chatham", "Pacific/Chuuk", "Pacific/Easter", "Pacific/Efate", "Pacific/Enderbury", "Pacific/Fakaofo", "Pacific/Fiji", "Pacific/Funafuti", "Pacific/Galapagos", "Pacific/Gambier", "Pacific/Guadalcanal", "Pacific/Guam", "Pacific/Honolulu", "Pacific/Kiritimati", "Pacific/Kosrae", "Pacific/Kwajalein", "Pacific/Majuro", "Pacific/Marquesas", "Pacific/Midway", "Pacific/Nauru", "Pacific/Niue", "Pacific/Norfolk", "Pacific/Noumea", "Pacific/Pago_Pago", "Pacific/Palau", "Pacific/Pitcairn", "Pacific/Pohnpei", "Pacific/Port_Moresby", "Pacific/Rarotonga", "Pacific/Saipan", "Pacific/Tahiti", "Pacific/Tarawa", "Pacific/Tongatapu", "Pacific/Wake", "Pacific/Wallis", ]; const BROWSER: [&str; 6] = ["Chrome", "Firefox", "Safari", "Edge", "Opera", "Yandex"]; const OS: [&str; 5] = ["Windows", "Mac", "iOS", "Android", "Linux"]; const LANGUAGE: [&str; 655] = [ "ps-AF", "fa-AF", "uz-AF", "sv-AX", "sq-AL", "en-AL", "ar-DZ", "fr-DZ", "kab-DZ", "en-AS", "ca-AD", "en-AD", "ln-AO", "pt-AO", "en-AI", "es-AI", "en-AG", "es-AG", "en-AR", "es-AR", "hy-AM", "nl-AW", "es-AW", "en-AU", "en-AT", "de-AT", "az-AZ", "az-AZ", "en-BS", "es-BS", "ar-BH", "bn-BD", "ccp-BD", "en-BD", "en-BB", "es-BB", "be-BY", "ru-BY", "nl-BE", "en-BE", "fr-BE", "de-BE", "wa-BE", "en-BZ", "es-BZ", "fr-BJ", "yo-BJ", "en-BM", "es-BM", "dz-BT", "qu-BO", "es-BO", "bs-BA", "bs-BA", "hr-BA", "en-BA", "sr-BA", "sr-BA", "en-BW", "tn-BW", "en-BR", "pt-BR", "es-BR", "en-IO", "en-VG", "es-VG", "ms-BN", "ms-BN", "bg-BG", "en-BG", "fr-BF", "ff-BF", "en-BI", "fr-BI", "rn-BI", "km-KH", "agq-CM", "ksf-CM", "bas-CM", "dua-CM", "en-CM", "ewo-CM", "fr-CM", "ff-CM", "kkj-CM", "nmg-CM", "mgo-CM", "mua-CM", "nnh-CM", "jgo-CM", "yav-CM", "en-CA", "fr-CA", "iu-CA", "moh-CA", "es-CA", "es-IC", "kea-CV", "pt-CV", "nl-BQ", "es-BQ", "en-KY", "es-KY", "fr-CF", "ln-CF", "sg-CF", "es-EA", "ar-TD", "fr-TD", "en-CL", "arn-CL", "es-CL", "yue-CN", "zh-CN", "zh-CN", "en-CN", "ii-CN", "bo-CN", "ug-CN", "en-CX", "en-CC", "en-CO", "es-CO", "ar-KM", "fr-KM", "fr-CG", "ln-CG", "fr-CD", "ln-CD", "lu-CD", "sw-CD", "en-CK", "es-CR", "fr-CI", "hr-HR", "en-HR", "es-CU", "nl-CW", "es-CW", "en-CY", "el-CY", "tr-CY", "cs-CZ", "en-CZ", "da-DK", "en-DK", "fo-DK", "en-DG", "ar-DJ", "fr-DJ", "so-DJ", "en-DM", "es-DM", "es-DO", "qu-EC", "es-EC", "ar-EG", "es-SV", "fr-GQ", "pt-GQ", "es-GQ", "ar-ER", "byn-ER", "en-ER", "gez-ER", "tig-ER", "ti-ER", "en-EE", "et-EE", "en-SZ", "ss-SZ", "am-ET", "gez-ET", "om-ET", "so-ET", "ti-ET", "wal-ET", "en-150", "en-FK", "es-FK", "fo-FO", "en-FJ", "en-FI", "fi-FI", "smn-FI", "se-FI", "sv-FI", "br-FR", "ca-FR", "co-FR", "en-FR", "fr-FR", "oc-FR", "pt-FR", "gsw-FR", "fr-GF", "es-GF", "fr-PF", "fr-GA", "en-GM", "ff-GM", "ka-GE", "os-GE", "ksh-DE", "en-DE", "de-DE", "nds-DE", "dsb-DE", "hsb-DE", "ak-GH", "en-GH", "ee-GH", "ff-GH", "gaa-GH", "ha-GH", "en-GI", "en-GR", "el-GR", "da-GL", "kl-GL", "es-GL", "en-GD", "es-GD", "fr-GP", "es-GP", "en-GU", "es-GT", "en-GG", "ff-GW", "pt-GW", "fr-GN", "ff-GN", "kpe-GN", "nqo-GN", "en-GY", "es-GY", "fr-HT", "es-HT", "es-HN", "yue-HK", "zh-HK", "zh-HK", "en-HK", "en-HU", "hu-HU", "en-IS", "is-IS", "as-IN", "bn-IN", "brx-IN", "ccp-IN", "en-IN", "gu-IN", "hi-IN", "kn-IN", "ks-IN", "ks-IN", "ks-IN", "kok-IN", "ml-IN", "mni-IN", "mni-IN", "mr-IN", "ne-IN", "or-IN", "pa-IN", "sa-IN", "sat-IN", "sat-IN", "ta-IN", "te-IN", "bo-IN", "ur-IN", "ur-IN", "ur-IN", "en-ID", "id-ID", "jv-ID", "ckb-IR", "mzn-IR", "lrc-IR", "fa-IR", "ar-IQ", "ckb-IQ", "lrc-IQ", "syr-IQ", "en-IE", "ga-IE", "en-IM", "gv-IM", "ar-IL", "en-IL", "he-IL", "ca-IT", "en-IT", "fur-IT", "de-IT", "it-IT", "sc-IT", "scn-IT", "en-JM", "en-JP", "ja-JP", "en-JE", "ar-JO", "kk-KZ", "ru-KZ", "ebu-KE", "en-KE", "guz-KE", "kln-KE", "kam-KE", "ki-KE", "luo-KE", "luy-KE", "mas-KE", "mer-KE", "om-KE", "saq-KE", "so-KE", "sw-KE", "dav-KE", "teo-KE", "en-KI", "sq-XK", "sr-XK", "sr-XK", "ar-KW", "ky-KG", "ru-KG", "lo-LA", "es-419", "en-LV", "lv-LV", "ar-LB", "en-LS", "st-LS", "en-LR", "ff-LR", "kpe-LR", "vai-LR", "vai-LR", "ar-LY", "de-LI", "gsw-LI", "en-LT", "lt-LT", "en-LU", "fr-LU", "de-LU", "lb-LU", "pt-LU", "zh-MO", "zh-MO", "en-MO", "pt-MO", "en-MG", "fr-MG", "mg-MG", "en-MW", "ny-MW", "en-MY", "ms-MY", "ms-MY", "ta-MY", "dv-MV", "en-MV", "bm-ML", "fr-ML", "khq-ML", "ses-ML", "en-MT", "mt-MT", "en-MH", "fr-MQ", "es-MQ", "ar-MR", "fr-MR", "ff-MR", "en-MU", "fr-MU", "mfe-MU", "fr-YT", "en-MX", "es-MX", "en-FM", "ro-MD", "ru-MD", "fr-MC", "mn-MN", "en-ME", "sr-ME", "sr-ME", "en-MS", "es-MS", "ar-MA", "tzm-MA", "fr-MA", "zgh-MA", "shi-MA", "shi-MA", "mgh-MZ", "pt-MZ", "seh-MZ", "my-MM", "en-MM", "af-NA", "en-NA", "naq-NA", "en-NR", "ne-NP", "nl-NL", "en-NL", "nds-NL", "fy-NL", "fr-NC", "en-NZ", "mi-NZ", "es-NI", "fr-NE", "ff-NE", "ha-NE", "twq-NE", "dje-NE", "en-NG", "ff-NG", "ha-NG", "ig-NG", "kaj-NG", "kcg-NG", "yo-NG", "en-NU", "en-NF", "ko-KP", "sq-MK", "mk-MK", "en-MP", "en-NO", "se-NO", "nb-NO", "nn-NO", "ar-OM", "en-PK", "ps-PK", "pa-PK", "pa-PK", "sd-PK", "ur-PK", "ur-PK", "ur-PK", "en-PW", "ar-PS", "es-PA", "en-PG", "gn-PY", "es-PY", "qu-PE", "es-PE", "ceb-PH", "en-PH", "fil-PH", "es-PH", "en-PN", "en-PL", "pl-PL", "en-PT", "pt-PT", "en-PR", "es-PR", "ar-QA", "fr-RE", "en-RO", "ro-RO", "ba-RU", "ce-RU", "cv-RU", "en-RU", "myv-RU", "os-RU", "ru-RU", "sah-RU", "tt-RU", "en-RW", "fr-RW", "rw-RW", "en-WS", "it-SM", "pt-ST", "ar-SA", "en-SA", "fr-SN", "ff-SN", "dyo-SN", "wo-SN", "en-RS", "sr-RS", "sr-RS", "en-SC", "fr-SC", "en-SL", "ff-SL", "zh-SG", "en-SG", "ms-SG", "ta-SG", "nl-SX", "en-SX", "es-SX", "en-SK", "sk-SK", "en-SI", "sl-SI", "en-SB", "ar-SO", "so-SO", "af-ZA", "en-ZA", "nso-ZA", "nr-ZA", "st-ZA", "ss-ZA", "ts-ZA", "tn-ZA", "ve-ZA", "xh-ZA", "zu-ZA", "en-KR", "ko-KR", "ar-SS", "en-SS", "nus-SS", "ast-ES", "eu-ES", "ca-ES", "en-ES", "gl-ES", "es-ES", "si-LK", "ta-LK", "fr-BL", "es-BL", "en-SH", "en-KN", "es-KN", "en-LC", "es-LC", "fr-MF", "es-MF", "fr-PM", "es-PM", "en-VC", "es-VC", "ar-SD", "en-SD", "nl-SR", "es-SR", "nb-SJ", "en-SE", "se-SE", "sv-SE", "en-CH", "fr-CH", "de-CH", "it-CH", "pt-CH", "rm-CH", "gsw-CH", "wae-CH", "ar-SY", "fr-SY", "syr-SY", "zh-TW", "en-TW", "trv-TW", "tg-TJ", "asa-TZ", "bez-TZ", "en-TZ", "lag-TZ", "jmc-TZ", "kde-TZ", "mas-TZ", "rof-TZ", "rwk-TZ", "sbp-TZ", "ksb-TZ", "sw-TZ", "vun-TZ", "en-TH", "th-TH", "pt-TL", "ee-TG", "fr-TG", "en-TK", "en-TO", "to-TO", "en-TT", "es-TT", "ar-TN", "fr-TN", "en-TR", "ku-TR", "tr-TR", "tk-TM", "en-TC", "es-TC", "en-TV", "en-UM", "en-VI", "es-VI", "cgg-UG", "en-UG", "lg-UG", "nyn-UG", "xog-UG", "sw-UG", "teo-UG", "en-UA", "ru-UA", "uk-UA", "ar-AE", "en-AE", "kw-GB", "en-GB", "gd-GB", "cy-GB", "chr-US", "en-US", "en-US", "haw-US", "lkt-US", "es-US", "es-UY", "uz-UZ", "uz-UZ", "en-VU", "fr-VU", "it-VA", "es-VE", "vi-VN", "fr-WF", "ar-EH", "ar-001", "en-001", "eo-001", "io-001", "ia-001", "jbo-001", "yi-001", "ar-YE", "bem-ZM", "en-ZM", "en-ZW", "nd-ZW", "sn-ZW", ]; const REGION: [&str; 251] = [ "Afghanistan", "Åland Islands", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antigua & Barbuda", "Argentina", "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", "Bosnia & Herzegovina", "Botswana", "Brazil", "British Indian Ocean Territory", "British Virgin Islands", "Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Cambodia", "Cameroon", "Canada", "Canary Islands", "Cape Verde", "Caribbean Netherlands", "Cayman Islands", "Central African Republic", "Ceuta & Melilla", "Chad", "Chile", "China mainland", "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Congo - Brazzaville", "Congo - Kinshasa", "Cook Islands", "Costa Rica", "Côte d’Ivoire", "Croatia", "Cuba", "Curaçao", "Cyprus", "Czechia", "Denmark", "Diego Garcia", "Djibouti", "Dominica", "Dominican Republic", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia", "Eswatini", "Ethiopia", "Europe", "Falkland Islands", "Faroe Islands", "Fiji", "Finland", "France", "French Guiana", "French Polynesia", "Gabon", "Gambia", "Georgia", "Germany", "Ghana", "Gibraltar", "Greece", "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guernsey", "Guinea-Bissau", "Guinea", "Guyana", "Haiti", "Honduras", "Hong Kong", "Hungary", "Iceland", "India", "Indonesia", "Iran", "Iraq", "Ireland", "Isle of Man", "Israel", "Italy", "Jamaica", "Japan", "Jersey", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Kosovo", "Kuwait", "Kyrgyzstan", "Laos", "Latin America", "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg", "Macao", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands", "Martinique", "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia", "Moldova", "Monaco", "Mongolia", "Montenegro", "Montserrat", "Morocco", "Mozambique", "Myanmar (Burma)", "Namibia", "Nauru", "Nepal", "Netherlands", "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island", "North Korea", "North Macedonia", "Northern Mariana Islands", "Norway", "Oman", "Pakistan", "Palau", "Palestinian Territories", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines", "Pitcairn Islands", "Poland", "Portugal", "Puerto Rico", "Qatar", "Réunion", "Romania", "Russia", "Rwanda", "Samoa", "San Marino", "São Tomé & Príncipe", "Saudi Arabia", "Senegal", "Serbia", "Seychelles", "Sierra Leone", "Singapore", "Sint Maarten", "Slovakia", "Slovenia", "Solomon Islands", "Somalia", "South Africa", "South Korea", "South Sudan", "Spain", "Sri Lanka", "St. Barthélemy", "St. Helena", "St. Kitts & Nevis", "St. Lucia", "St. Martin", "St. Pierre & Miquelon", "St. Vincent & Grenadines", "Sudan", "Suriname", "Svalbard & Jan Mayen", "Sweden", "Switzerland", "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand", "Timor-Leste", "Togo", "Tokelau", "Tonga", "Trinidad & Tobago", "Tunisia", "Turkey", "Turkmenistan", "Turks & Caicos Islands", "Tuvalu", "U.S. Outlying Islands", "U.S. Virgin Islands", "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", "Uruguay", "Uzbekistan", "Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Wallis & Futuna", "Western Sahara", "World", "Yemen", "Zambia", "Zimbabwe", ]; fn random_visitor_hash() -> u64 { let project: i64 = random(); let region = REGION.choose(&mut OsRng).cloned().unwrap().to_string(); let timezone = TIMEZONE.choose(&mut OsRng).cloned().unwrap().to_string(); let language = LANGUAGE.choose(&mut OsRng).cloned().unwrap().to_string(); let browser = BROWSER.choose(&mut OsRng).cloned().unwrap().to_string(); let platform = OS.choose(&mut OsRng).cloned().unwrap().to_string(); let width = random::() as i32; let height = random::() as i32; let mut hasher = Hasher::new(); hasher.write(project as u64); hasher.write_bytes(region.as_bytes()); hasher.write_bytes(timezone.as_bytes()); hasher.write_bytes(language.as_bytes()); hasher.write_bytes(browser.as_bytes()); hasher.write_bytes(platform.as_bytes()); hasher.write(width as u64); hasher.write(height as u64); hasher.finalize() } fn main() { let n = 2usize.pow(28); // <-- 🪛 loop { let start = Instant::now(); let hashes = Arc::new(HashSet::with_capacity(n)); let collisions = AtomicUsize::new(0); (0..n).into_par_iter().for_each(|_| { if hashes.insert(random_visitor_hash()).is_err() { collisions.fetch_add(1, Ordering::Relaxed); } }); println!( "{} collisions (generated {n} hashes in {:?})", collisions.load(Ordering::Relaxed), start.elapsed() ); sleep(Duration::from_secs(5)); } }