Generatore di dati fittizi
Genera dati fittizi che superano la validazione: carte con Luhn, IBAN con mod-97, UUID veri. Con seed e riproducibile: JSON, CSV, NDJSON o SQL.
[
{
"id": "018cc251-f400-79a7-abdf-9623646f1963",
"first_name": "Ruby",
"last_name": "Long",
"email": "[email protected]",
"country": "IE",
"created_at": "2024-04-13T08:13:34Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc251-f7e8-7727-8c38-6095cbcabdb9",
"first_name": "Ellen",
"last_name": "Hoffman",
"email": "[email protected]",
"country": "US",
"created_at": "2024-06-28T10:45:21Z",
"last_seen_at": "2024-10-31T16:44:09Z",
"is_active": false
},
{
"id": "018cc251-fbd0-7056-ad40-e80a775668cc",
"first_name": "Keith",
"last_name": "Hudson",
"email": "[email protected]",
"country": "AR",
"created_at": "2025-08-11T01:04:04Z",
"last_seen_at": "2025-09-19T15:18:41Z",
"is_active": true
},
{
"id": "018cc251-ffb8-74a1-b4c8-83cc6bd2ae90",
"first_name": "Thomas",
"last_name": "Moore",
"email": "[email protected]",
"country": "BE",
"created_at": "2025-02-21T16:27:55Z",
"last_seen_at": "2025-04-28T03:30:59Z",
"is_active": true
},
{
"id": "018cc252-03a0-7309-8795-f9f277a8f8c0",
"first_name": "Benjamin",
"last_name": "Austin",
"email": "[email protected]",
"country": "MX",
"created_at": "2024-06-15T11:04:56Z",
"last_seen_at": "2025-06-30T22:00:26Z",
"is_active": true
},
{
"id": "018cc252-0788-7658-937d-58b138c92232",
"first_name": "Barbara",
"last_name": "Flores",
"email": "[email protected]",
"country": "GR",
"created_at": "2024-04-17T19:41:08Z",
"last_seen_at": "2025-01-13T23:55:46Z",
"is_active": true
},
{
"id": "018cc252-0b70-7c3a-96ae-719ee90a05af",
"first_name": "Allen",
"last_name": "Vazquez",
"email": "[email protected]",
"country": "NG",
"created_at": "2024-09-18T13:23:49Z",
"last_seen_at": "2026-05-04T06:32:51Z",
"is_active": false
},
{
"id": "018cc252-0f58-7dfd-8623-52572f04ce20",
"first_name": "Harry",
"last_name": "Nichols",
"email": "[email protected]",
"country": "SG",
"created_at": "2026-06-26T14:48:47Z",
"last_seen_at": "2026-06-30T12:56:13Z",
"is_active": false
},
{
"id": "018cc252-1340-738f-b536-279444cb4512",
"first_name": "Elaine",
"last_name": "Wagner",
"email": "[email protected]",
"country": "UA",
"created_at": "2025-05-09T14:48:44Z",
"last_seen_at": "2026-05-19T14:58:47Z",
"is_active": true
},
{
"id": "018cc252-1728-7d96-8856-b87ee9d904e9",
"first_name": "Fred",
"last_name": "Fisher",
"email": "[email protected]",
"country": "JP",
"created_at": "2025-11-25T05:27:13Z",
"last_seen_at": "2026-04-04T05:36:09Z",
"is_active": true
},
{
"id": "018cc252-1b10-7baa-a79b-9567cf1366fd",
"first_name": "Lois",
"last_name": "Nelson",
"email": "[email protected]",
"country": "FR",
"created_at": "2025-05-08T16:32:25Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-1ef8-7c8c-b859-cea655faef9c",
"first_name": "Mark",
"last_name": "Cunningham",
"email": "[email protected]",
"country": "FI",
"created_at": "2026-02-21T11:09:02Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-22e0-77bf-bc1c-40120a5b29c4",
"first_name": "Anne",
"last_name": "Flores",
"email": "[email protected]",
"country": "KR",
"created_at": "2025-08-02T22:55:20Z",
"last_seen_at": "2025-10-27T03:27:52Z",
"is_active": true
},
{
"id": "018cc252-26c8-7220-9453-1804e8ce88c4",
"first_name": "Arthur",
"last_name": "Crawford",
"email": "[email protected]",
"country": "PL",
"created_at": "2025-02-26T04:55:03Z",
"last_seen_at": "2025-07-25T07:05:17Z",
"is_active": true
},
{
"id": "018cc252-2ab0-75a8-8a2b-28833306b87c",
"first_name": "Ronald",
"last_name": "Hansen",
"email": "[email protected]",
"country": "KR",
"created_at": "2025-03-09T06:31:44Z",
"last_seen_at": "2026-01-04T03:11:24Z",
"is_active": true
},
{
"id": "018cc252-2e98-7c38-93e2-9f80d039eb75",
"first_name": "Donna",
"last_name": "Porter",
"email": "[email protected]",
"country": "IE",
"created_at": "2026-01-12T06:55:22Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-3280-77a0-8152-8f5a9584a581",
"first_name": "Carol",
"last_name": "Wells",
"email": "[email protected]",
"country": "PL",
"created_at": "2025-07-20T23:09:02Z",
"last_seen_at": "2026-01-24T23:04:38Z",
"is_active": true
},
{
"id": "018cc252-3668-7208-8bbe-619dada6b7e0",
"first_name": "Sheila",
"last_name": "Lee",
"email": "[email protected]",
"country": "PT",
"created_at": "2025-01-05T20:09:52Z",
"last_seen_at": "2025-04-08T12:02:09Z",
"is_active": false
},
{
"id": "018cc252-3a50-7b11-9261-0c17e909f6fb",
"first_name": "Jack",
"last_name": "Evans",
"email": "[email protected]",
"country": "KE",
"created_at": "2025-12-29T14:31:00Z",
"last_seen_at": "2026-03-28T14:30:43Z",
"is_active": true
},
{
"id": "018cc252-3e38-7f22-8cc7-0dd649d26379",
"first_name": "Randy",
"last_name": "Harris",
"email": "[email protected]",
"country": "GB",
"created_at": "2026-06-26T19:25:04Z",
"last_seen_at": "2026-06-30T08:39:51Z",
"is_active": true
},
{
"id": "018cc252-4220-7e86-8dae-b25b4f837713",
"first_name": "Josephine",
"last_name": "Castro",
"email": "[email protected]",
"country": "DK",
"created_at": "2024-02-07T22:33:55Z",
"last_seen_at": "2026-02-23T13:56:30Z",
"is_active": true
},
{
"id": "018cc252-4608-7120-abd5-535883ca01b9",
"first_name": "Edith",
"last_name": "Graham",
"email": "[email protected]",
"country": "CN",
"created_at": "2024-04-29T08:59:26Z",
"last_seen_at": "2024-06-17T10:20:45Z",
"is_active": true
},
{
"id": "018cc252-49f0-77f7-9bf9-17e87b0a09c6",
"first_name": "Tracy",
"last_name": "Willis",
"email": "[email protected]",
"country": "PT",
"created_at": "2024-03-21T07:42:06Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-4dd8-75c8-8b04-1e0fb891e435",
"first_name": "Irene",
"last_name": "Larson",
"email": "[email protected]",
"country": "AT",
"created_at": "2025-06-04T15:01:38Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-51c0-7be0-a6ca-12bc704a2b3f",
"first_name": "Betty",
"last_name": "Morrison",
"email": "[email protected]",
"country": "ID",
"created_at": "2025-11-11T21:56:19Z",
"last_seen_at": "2026-03-29T03:33:49Z",
"is_active": true
},
{
"id": "018cc252-55a8-736d-a7b2-8bec744ecf74",
"first_name": "Kevin",
"last_name": "Cox",
"email": "[email protected]",
"country": "GR",
"created_at": "2025-10-06T23:28:21Z",
"last_seen_at": null,
"is_active": false
},
{
"id": "018cc252-5990-73ca-a2d3-89bf2b8eb5f6",
"first_name": "Sean",
"last_name": "Carr",
"email": "[email protected]",
"country": "KR",
"created_at": "2026-02-19T23:27:53Z",
"last_seen_at": "2026-03-02T22:16:30Z",
"is_active": true
},
{
"id": "018cc252-5d78-79e2-bd4d-d8b6867867dc",
"first_name": "Heather",
"last_name": "Ferguson",
"email": "[email protected]",
"country": "IL",
"created_at": "2024-07-07T01:39:16Z",
"last_seen_at": "2025-09-21T19:17:00Z",
"is_active": false
},
{
"id": "018cc252-6160-78f8-a9af-d73b74581b86",
"first_name": "Rose",
"last_name": "Chen",
"email": "[email protected]",
"country": "DE",
"created_at": "2024-09-07T16:16:48Z",
"last_seen_at": "2024-10-02T08:29:39Z",
"is_active": true
},
{
"id": "018cc252-6548-71f0-ab4f-c824fd842a67",
"first_name": "Maria",
"last_name": "Brooks",
"email": "[email protected]",
"country": "FR",
"created_at": "2024-06-29T06:22:30Z",
"last_seen_at": "2025-12-22T00:38:13Z",
"is_active": true
},
{
"id": "018cc252-6930-7067-b516-480051493ec0",
"first_name": "Donna",
"last_name": "Hamilton",
"email": "[email protected]",
"country": "IE",
"created_at": "2024-09-01T09:09:40Z",
"last_seen_at": "2025-03-29T23:26:22Z",
"is_active": false
},
{
"id": "018cc252-6d18-7de1-bae1-21dc471405fa",
"first_name": "Rachel",
"last_name": "Wagner",
"email": "[email protected]",
"country": "IE",
"created_at": "2026-05-31T02:06:02Z",
"last_seen_at": "2026-06-17T16:37:27Z",
"is_active": false
},
{
"id": "018cc252-7100-752d-bc4e-c4e5bd755743",
"first_name": "Philip",
"last_name": "Jones",
"email": "[email protected]",
"country": "NO",
"created_at": "2024-10-21T12:22:35Z",
"last_seen_at": "2025-02-15T07:00:10Z",
"is_active": true
},
{
"id": "018cc252-74e8-7b4d-b9cf-4e8e03d1e269",
"first_name": "Bonnie",
"last_name": "Carter",
"email": "[email protected]",
"country": "PT",
"created_at": "2026-05-28T06:16:25Z",
"last_seen_at": "2026-06-26T21:36:12Z",
"is_active": true
},
{
"id": "018cc252-78d0-708b-a96f-d9f474e95238",
"first_name": "Douglas",
"last_name": "Evans",
"email": "[email protected]",
"country": "NG",
"created_at": "2024-02-18T20:36:33Z",
"last_seen_at": "2024-10-31T01:37:50Z",
"is_active": true
},
{
"id": "018cc252-7cb8-7865-96fa-e9681611dbed",
"first_name": "Theresa",
"last_name": "Larson",
"email": "[email protected]",
"country": "NZ",
"created_at": "2024-11-21T08:57:18Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-80a0-7eca-80cd-7159faf3467f",
"first_name": "Gladys",
"last_name": "Reyes",
"email": "[email protected]",
"country": "NG",
"created_at": "2024-04-27T11:34:46Z",
"last_seen_at": "2026-03-09T18:39:31Z",
"is_active": true
},
{
"id": "018cc252-8488-76b2-9271-dabf0da27b4f",
"first_name": "Bonnie",
"last_name": "Cook",
"email": "[email protected]",
"country": "AT",
"created_at": "2024-01-13T17:42:35Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-8870-70d0-ab33-72cd838e6603",
"first_name": "Diane",
"last_name": "Wells",
"email": "[email protected]",
"country": "NZ",
"created_at": "2024-05-02T11:22:23Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-8c58-725c-980d-f206b971497b",
"first_name": "Gloria",
"last_name": "Woods",
"email": "[email protected]",
"country": "IT",
"created_at": "2025-06-27T01:56:54Z",
"last_seen_at": "2025-09-04T17:13:00Z",
"is_active": true
},
{
"id": "018cc252-9040-786d-90d1-5c9bae512dbf",
"first_name": "Alan",
"last_name": "Rodriguez",
"email": "[email protected]",
"country": "DK",
"created_at": "2026-03-29T17:48:08Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-9428-7b58-8dde-508b603b97d8",
"first_name": "Leonard",
"last_name": "Jones",
"email": "[email protected]",
"country": "MX",
"created_at": "2026-02-06T22:38:18Z",
"last_seen_at": "2026-04-27T00:46:32Z",
"is_active": true
},
{
"id": "018cc252-9810-7c69-8024-23852691d72c",
"first_name": "Maria",
"last_name": "Davis",
"email": "[email protected]",
"country": "JP",
"created_at": "2025-03-30T14:01:05Z",
"last_seen_at": "2025-04-24T10:25:01Z",
"is_active": true
},
{
"id": "018cc252-9bf8-7e3a-a37a-06b1a661a0dc",
"first_name": "Carl",
"last_name": "Duncan",
"email": "[email protected]",
"country": "KE",
"created_at": "2026-03-30T06:02:52Z",
"last_seen_at": "2026-05-16T00:15:55Z",
"is_active": false
},
{
"id": "018cc252-9fe0-7a01-8a38-5d3e36f9eca3",
"first_name": "Phillip",
"last_name": "Harrison",
"email": "[email protected]",
"country": "DK",
"created_at": "2024-07-12T01:56:26Z",
"last_seen_at": "2026-05-28T21:32:17Z",
"is_active": true
},
{
"id": "018cc252-a3c8-7977-a212-1c82b978ccbe",
"first_name": "Kim",
"last_name": "Franklin",
"email": "[email protected]",
"country": "KE",
"created_at": "2024-09-23T15:16:03Z",
"last_seen_at": "2025-08-20T03:29:07Z",
"is_active": true
},
{
"id": "018cc252-a7b0-78f6-bb2a-d194bc638e71",
"first_name": "Patrick",
"last_name": "Coleman",
"email": "[email protected]",
"country": "ID",
"created_at": "2025-01-06T09:04:26Z",
"last_seen_at": "2025-07-21T22:36:07Z",
"is_active": true
},
{
"id": "018cc252-ab98-7b5b-8f5c-8b6a21b71208",
"first_name": "Harry",
"last_name": "Martin",
"email": "[email protected]",
"country": "ES",
"created_at": "2026-02-21T17:42:10Z",
"last_seen_at": "2026-05-16T20:52:12Z",
"is_active": true
},
{
"id": "018cc252-af80-7504-8719-59c6e3efd9c3",
"first_name": "Carlos",
"last_name": "Gibson",
"email": "[email protected]",
"country": "ZA",
"created_at": "2024-01-14T06:39:34Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-b368-7525-9a9c-a09c2f8c2c8b",
"first_name": "Jean",
"last_name": "Morales",
"email": "[email protected]",
"country": "CA",
"created_at": "2025-06-05T13:13:54Z",
"last_seen_at": "2025-07-18T07:30:36Z",
"is_active": true
},
{
"id": "018cc252-b750-76bd-81cc-42435c3231bd",
"first_name": "Ernest",
"last_name": "Cooper",
"email": "[email protected]",
"country": "FR",
"created_at": "2026-06-30T05:15:30Z",
"last_seen_at": "2026-06-30T22:07:31Z",
"is_active": true
},
{
"id": "018cc252-bb38-7a65-8fdd-29417173ce08",
"first_name": "John",
"last_name": "Wallace",
"email": "[email protected]",
"country": "GR",
"created_at": "2024-01-01T11:53:11Z",
"last_seen_at": "2025-05-13T01:10:51Z",
"is_active": false
},
{
"id": "018cc252-bf20-7253-a075-e01c6d997ffd",
"first_name": "Lee",
"last_name": "Brooks",
"email": "[email protected]",
"country": "AU",
"created_at": "2024-03-20T07:03:24Z",
"last_seen_at": "2025-04-29T10:30:14Z",
"is_active": true
},
{
"id": "018cc252-c308-7709-a61e-916f4cb44f86",
"first_name": "Antonio",
"last_name": "Evans",
"email": "[email protected]",
"country": "JP",
"created_at": "2025-09-17T01:49:49Z",
"last_seen_at": "2026-04-27T19:54:08Z",
"is_active": true
},
{
"id": "018cc252-c6f0-7095-be95-c60913b0062d",
"first_name": "Jose",
"last_name": "Porter",
"email": "[email protected]",
"country": "ZA",
"created_at": "2024-06-01T00:33:54Z",
"last_seen_at": "2024-09-30T08:59:58Z",
"is_active": false
},
{
"id": "018cc252-cad8-7565-b5d8-117f4a6fb217",
"first_name": "Eric",
"last_name": "Ward",
"email": "[email protected]",
"country": "TR",
"created_at": "2024-03-06T08:01:45Z",
"last_seen_at": "2024-10-07T12:38:03Z",
"is_active": true
},
{
"id": "018cc252-cec0-79ae-adaa-96058dd4aabe",
"first_name": "Marjorie",
"last_name": "Cox",
"email": "[email protected]",
"country": "NG",
"created_at": "2026-06-08T11:01:04Z",
"last_seen_at": "2026-06-20T16:41:37Z",
"is_active": true
},
{
"id": "018cc252-d2a8-7d31-bab8-63bfaa7342bd",
"first_name": "Bryan",
"last_name": "Pena",
"email": "[email protected]",
"country": "IT",
"created_at": "2024-01-06T14:25:41Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-d690-7e1b-a275-f48a8c1ccbf6",
"first_name": "Catherine",
"last_name": "Munoz",
"email": "[email protected]",
"country": "AU",
"created_at": "2026-05-30T07:29:25Z",
"last_seen_at": "2026-06-23T08:23:39Z",
"is_active": true
},
{
"id": "018cc252-da78-7c22-9180-f137d46ec702",
"first_name": "Joyce",
"last_name": "Jordan",
"email": "[email protected]",
"country": "TR",
"created_at": "2025-01-13T19:52:26Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-de60-7bc5-907f-8eebca9226bf",
"first_name": "Jennifer",
"last_name": "Riley",
"email": "[email protected]",
"country": "AT",
"created_at": "2026-02-21T06:27:48Z",
"last_seen_at": "2026-04-30T10:23:57Z",
"is_active": true
},
{
"id": "018cc252-e248-7464-86b7-54ee11fc6051",
"first_name": "Amanda",
"last_name": "Daniels",
"email": "[email protected]",
"country": "IL",
"created_at": "2025-04-29T02:18:30Z",
"last_seen_at": "2026-04-17T18:37:07Z",
"is_active": false
},
{
"id": "018cc252-e630-7bf3-ab8d-a72175e7c3fb",
"first_name": "Laura",
"last_name": "Alvarado",
"email": "[email protected]",
"country": "PT",
"created_at": "2024-08-26T17:26:51Z",
"last_seen_at": "2025-09-16T12:46:07Z",
"is_active": true
},
{
"id": "018cc252-ea18-74fb-955a-5d6d42ed1760",
"first_name": "Andrea",
"last_name": "Turner",
"email": "[email protected]",
"country": "CA",
"created_at": "2024-07-13T08:04:19Z",
"last_seen_at": "2025-01-08T17:24:13Z",
"is_active": true
},
{
"id": "018cc252-ee00-7216-953a-2094b3402b1e",
"first_name": "Margaret",
"last_name": "Jackson",
"email": "[email protected]",
"country": "NZ",
"created_at": "2025-07-14T00:05:54Z",
"last_seen_at": "2026-05-05T09:44:04Z",
"is_active": true
},
{
"id": "018cc252-f1e8-7262-91aa-5818265220ca",
"first_name": "Rose",
"last_name": "Johnson",
"email": "[email protected]",
"country": "KR",
"created_at": "2024-07-18T02:49:21Z",
"last_seen_at": "2025-04-18T08:52:53Z",
"is_active": true
},
{
"id": "018cc252-f5d0-72f1-ba49-a52514f881dd",
"first_name": "Fred",
"last_name": "George",
"email": "[email protected]",
"country": "PL",
"created_at": "2025-10-26T23:11:53Z",
"last_seen_at": "2025-11-05T21:15:27Z",
"is_active": true
},
{
"id": "018cc252-f9b8-7173-b05d-540124a4fc47",
"first_name": "Sara",
"last_name": "Greene",
"email": "[email protected]",
"country": "PT",
"created_at": "2026-04-26T10:11:22Z",
"last_seen_at": "2026-05-07T04:01:08Z",
"is_active": true
},
{
"id": "018cc252-fda0-7ed5-a24a-3f179c69fc3c",
"first_name": "Jesse",
"last_name": "Bennett",
"email": "[email protected]",
"country": "SG",
"created_at": "2025-10-08T16:19:51Z",
"last_seen_at": "2026-03-04T05:50:50Z",
"is_active": true
},
{
"id": "018cc253-0188-74dd-a728-ed228fc827ac",
"first_name": "Louise",
"last_name": "Santos",
"email": "[email protected]",
"country": "FI",
"created_at": "2026-05-29T18:38:35Z",
"last_seen_at": "2026-06-01T15:33:29Z",
"is_active": true
},
{
"id": "018cc253-0570-7408-b582-07fbebeacbbf",
"first_name": "Scott",
"last_name": "Grant",
"email": "[email protected]",
"country": "NZ",
"created_at": "2024-02-11T17:35:11Z",
"last_seen_at": "2025-08-06T23:23:49Z",
"is_active": true
},
{
"id": "018cc253-0958-7c12-b38e-edc7af958916",
"first_name": "Judy",
"last_nSono mostrati i primi 20000 caratteri su 28086. Copia e download li prendono tutti.
La posta va a example.com, i telefoni al blocco 555-0100, gli indirizzi alle reti di documentazione e le carte ai BIN di prova pubblicati: ogni valore predefinito qui è un intervallo riservato da uno standard, così nulla di generato può appartenere a una persona reale.
Dati che superano i vostri validatori
La lamentela abituale sui dati di test generati non è che sembrino finti. È che falliscono. Un numero di carta che nessuna libreria di pagamenti accetterà, un IBAN che un modulo bancario rifiuta, un ISBN che un lettore di codici a barre non riesce a leggere, un UUID la cui cifra di versione è semplicemente ciò che i byte casuali si sono trovati a essere. Si finisce per correggere il fixture a mano, e a quel punto il generatore è costato più di quanto abbia fatto risparmiare.
Ogni valore qui per cui uno standard pubblicato definisce un controllo porta il controllo giusto. È poca aritmetica e cambia a cosa servono i dati: potete puntarci la vostra validazione vera.
- I numeri di carta portano la cifra di controllo di Luhn di ISO/IEC 7812-1, calcolata sulle cifre che la precedono, e poggiano sul BIN di prova pubblicato del circuito che scegliete.
- Gli IBAN soddisfano ISO 7064 mod-97 — le cifre di controllo sono scelte in modo che il numero riordinato e con le lettere espanse lasci resto 1 — e hanno esattamente la lunghezza registrata da quel paese, cosa che il solo mod-97 non coglierebbe.
- I valori ISBN-13 ed EAN-13 portano la cifra di controllo con i pesi alternati 1 e 3, sotto uno dei due prefissi GS1 assegnati al sistema ISBN.
- Gli UUID portano il nibble di versione e i due bit di variante richiesti da RFC 9562, così un analizzatore dichiara v4 o v7 invece di alzare le spalle.
- Indirizzi, marche temporali, versioni semantiche e codici valuta sono scritti nella forma che il loro standard definisce, non in un'approssimazione.
Niente di tutto ciò rende i dati veri. Li rende ben formati, che è l'unica proprietà che un fixture possa onestamente rivendicare.
Il seed, e perché è tutto
Un generatore che dà righe diverse ogni volta è un giocattolo. Appena i dati entrano in un test, in una dimostrazione o in una schermata, bisogna poterli riavere: dopo un ricaricamento, sulla macchina di un collega, nella integrazione continua fra un anno.
Perciò qui la casualità ha un seed. Il seed è una stringa che scegliete voi, e lo stesso seed con lo stesso schema e lo stesso numero di righe produce ovunque un risultato identico byte per byte. Il generatore è xoshiro128**, inizializzato tramite splitmix64; entrambi sono algoritmi pubblicati con implementazioni di riferimento, e questa pagina è verificata contro un output trascritto da quei riferimenti e non contro sé stessa.
seed "orders-2026" same rows, every time, everywhere seed "orders-2027" a completely different set field stream = hash(seed, field name) row N of a field depends on nothing but the seed, the name and N
Quest'ultima riga merita due letture, perché è ciò che rende lo strumento utilizzabile e non soltanto riproducibile. Ogni campo attinge a un flusso proprio, legato al suo nome. Aggiungete una colonna e tutte quelle esistenti escono identiche. Portate le righe da cento a mille e le prime cento sono quelle che avevate già. Un fixture versionato ieri corrisponde ancora dopo che oggi avete ampliato lo schema.
Il prezzo onesto del legame al nome è che rinominare un campo ne sostituisce i dati, perché il nome è metà del seed. La quota di valori vuoti è l'unica impostazione deliberatamente esclusa: la decisione di svuotare un valore è presa dopo averlo estratto, così attivare i vuoti toglie alcune righe senza spostare le altre.
Da tutto questo discende direttamente un avvertimento. Un generatore con seed è prevedibile per progetto, ed è proprio il pregio. Nulla di ciò che produce può mai servire come password, token o chiave. Per quello usate un generatore che attinga alla sorgente crittografica della piattaforma.
Intervalli riservati perché i vostri dati non possano essere reali
Un generatore che emette indirizzi su un dominio di posta reale vi mette in mano un'arma carica. Le suite di test inviano posta. Gli ambienti di staging finiscono puntati sull'SMTP di produzione. I test di carico martellano l'indirizzo IP scritto nel fixture. Quando il valore appartiene a qualcuno, l'incidente lo raggiunge.
Gli enti di normazione lo hanno previsto e hanno messo da parte intervalli che è garantito non verranno mai assegnati. Ogni valore predefinito qui attinge da uno di essi:
- La posta atterra su example.com, example.net ed example.org, che RFC 2606 riserva in perpetuo, insieme ai domini di primo livello .test, .example e .invalid aggiunti da RFC 6761.
- I numeri di telefono usano da 555-0100 a 555-0199, il blocco che la numerazione nordamericana riserva alla finzione — ed è per questo che i film lo usano.
- Gli indirizzi IPv4 provengono da 192.0.2.0/24, 198.51.100.0/24 e 203.0.113.0/24, le tre reti di documentazione di RFC 5737, e gli IPv6 da 2001:db8::/32 secondo RFC 3849.
- Gli indirizzi MAC alzano il bit di amministrazione locale, che l'IEEE garantisce di non assegnare mai; è offerto anche il blocco di documentazione di RFC 7042, benché contenga solo 256 indirizzi.
- I numeri di carta sono costruiti sui quattro BIN di prova pubblicati e non su un intervallo di emissione attivo, così un numero valido secondo Luhn non può coincidere con una carta reale.
Ciascuno di questi può essere sovrascritto quando avete una ragione: un dominio vostro per un ambiente di staging, un blocco CIDR che corrisponde alla vostra rete. Il valore predefinito è la risposta sicura, e la sovrascrittura resta una decisione consapevole.
I nomi e i luoghi provengono dalle distribuzioni di nomi pubblicate dall'Ufficio del censimento degli Stati Uniti e dal suo elenco di comuni costituiti. Sono nomi inglesi comuni, il che significa che un nome generato può coincidere con quello di una persona reale — come può accadere a qualsiasi nome. Trattate l'uscita per ciò che è: stringhe plausibili, non persone.
Campi che si riferiscono l'uno all'altro
Colonne indipendenti producono righe che si sfaldano a uno sguardo. Un'utente di nome Dana Levy il cui indirizzo di posta non ha nulla a che vedere con il suo nome sembra rotta in una schermata, e una marca temporale di aggiornamento precedente a quella di creazione farà fallire un'asserzione vera.
Invece di un caso speciale per ogni coppia c'è un solo meccanismo: qualsiasi impostazione contrassegnata come capace di accogliere riferimenti può nominare un altro campo fra doppie parentesi graffe, e viene riempita dalla stessa riga. I campi vengono allora generati in ordine di dipendenza e non in quello in cui li avete elencati, e un cerchio di riferimenti viene segnalato come errore di schema invece di bloccarsi.
Arriva più lontano della posta. Un campo modello costruisce qualunque stringa vogliate a partire da altre colonne, con una trasformazione facoltativa delle maiuscole. Il limite inferiore o superiore di un campo data può nominare un altro campo data, ed è così che si ottiene una linea temporale coerente. E quando un valore riferito è vuoto, anche il campo che ne dipende è vuoto, invece di ripiegare in silenzio su una finestra predefinita che lo schema non ha mai menzionato.
Tirarlo fuori: JSON, NDJSON, CSV, SQL
JSON è l'ovvio ed esce con i rientri o su una sola riga. NDJSON — un oggetto compatto per riga — è ciò che si aspettano le catene di log e gli importatori a flusso, ed è il formato da incollare in uno strumento che legge un record alla volta.
Il CSV segue RFC 4180: i campi sono racchiusi fra virgolette solo se contengono una virgola, una virgoletta o un ritorno a capo, una virgoletta interna viene raddoppiata e le righe finiscono con CRLF. È la forma su cui concordano i fogli di calcolo e i caricatori massivi dei database.
È in SQL che i generatori diventano di solito sciatti, perché la risposta giusta dipende dal dialetto. La citazione degli identificatori cambia — PostgreSQL e SQLite prendono le virgolette doppie, MySQL prende gli apici inversi, SQL Server prende le parentesi quadre — e ciascuno raddoppia il proprio carattere dentro un nome. Le stringhe letterali raddoppiano ovunque l'apice singolo, ma MySQL legge anche la barra rovesciata come escape se NO_BACKSLASH_ESCAPES non è impostato, così un percorso Windows che finisce con una barra si mangerebbe l'apice di chiusura. I booleani sono la terza differenza: PostgreSQL ha un vero tipo booleano e gli altri vogliono 1 e 0. E SQL Server rifiuta un costruttore di tabella con più di mille righe, così un'esportazione grande esce come più istruzioni invece di una che fallisce.
PostgreSQL INSERT INTO "records" ("id", "ok") VALUES (1, TRUE);
MySQL INSERT INTO `records` (`id`, `ok`) VALUES (1, 1);
SQLite INSERT INTO "records" ("id", "ok") VALUES (1, 1);
SQL Server INSERT INTO [records] ([id], [ok]) VALUES (1, 1);Lo schema è un file
Il pannello accanto al costruttore è lo stesso schema scritto in JSON, e funziona nei due sensi: modificate i campi e si aggiorna, incollate uno schema e il costruttore lo segue. Le opzioni lasciate al valore predefinito vengono omesse, così ciò che rileggete sono le decisioni che avete preso e non ogni manopola che lo strumento possiede.
Quel file, insieme al seed che contiene, è l'intera unità riproducibile. Mettetelo accanto al test che consuma i dati e il fixture diventa qualcosa che un revisore può leggere e un collega può rigenerare, invece di un grosso blocco di valori che nessuno sa spiegare.
Domande frequenti
- I numeri di carta di credito sono veri?
- Sono validi e non sono veri. Ciascuno porta una cifra di controllo di Luhn corretta, così una libreria di pagamenti ne accetta il formato, e ciascuno è costruito su uno dei quattro BIN di prova pubblicati invece che su un intervallo di emissione attivo, così non può coincidere con una carta che qualcuno possiede. Non autorizzeranno alcun pagamento da nessuna parte.
- Lo stesso seed mi darà davvero gli stessi dati l'anno prossimo?
- Sì. Il generatore è un algoritmo pubblicato con un'implementazione di riferimento fissa, non un'interfaccia del browser il cui comportamento può cambiare, e questa pagina è verificata contro un output trascritto da quel riferimento. Nulla legge l'orologio: gli intervalli di date sono valori letterali nello schema. Conservate il JSON dello schema e il seed che contiene e le righe tornano identiche.
- Perché aggiungere una colonna non ha cambiato nient'altro?
- Perché ogni campo attinge a un flusso proprio, legato al seed e al nome del campo. È voluto: un fixture che si rimescola ogni volta che ampliate lo schema non si può tenere in un repository. La stessa proprietà fa sì che aumentare le righe lasci intatte quelle precedenti.
- Ho rinominato un campo e i suoi dati sono cambiati.
- Discende dallo stesso progetto: il nome del campo è metà della chiave del suo flusso. Se volete conservare i valori, rinominate la colonna più avanti nella catena, oppure accettate la nuova estrazione. Non c'è modo di avere insieme stabilità alla rinomina e stabilità al riordino senza un identificatore nascosto che il file di schema dovrebbe poi portarsi dietro.
- Posso generare così una password o una chiave API?
- No. Tutto qui viene da un generatore pseudocasuale con seed, prevedibile per progetto, ed è proprio per questo che l'uscita è riproducibile. Un segreto deve venire dalla sorgente crittografica della piattaforma. Per quello usate un generatore di token dedicato.
- Come faccio a far corrispondere la posta al nome?
- Aggiungete un campo modello e scrivete le altre colonne fra doppie parentesi graffe — qualcosa come {{first_name}}.{{last_name}}@example.com — poi impostate la trasformazione su minuscolo. I campi sono generati in ordine di dipendenza, quindi il modello può nominare una colonna che compare dopo di esso nell'elenco.
- Quante righe può produrre?
- Diecimila, su un massimo di quaranta campi. A queste dimensioni la generazione è abbastanza rapida da restare sul thread principale; ciò che diventa davvero scomodo è il testo risultante, ed è per questo che il pannello mostra un'anteprima troncata mentre copia e download prendono tutto.
- Qualcosa di tutto ciò esce dal mio browser?
- No. Il generatore, il corpus di nomi e tutti i formati di uscita girano come JavaScript nella pagina. Non c'è alcuna chiamata a un server, e nulla di ciò che scrivete nello schema viene inviato da qualche parte.