VCL Varnish randomint_seeded and std.strtol in PHP or Javascript

Para fines de prueba de AB generamos un hash unqiue de un usuario Id en un valor de cubo en VCL (por rápidamente CDN).

set var.backResult =
  randomint_seeded(1, 4,
    std.strtol(
       substr(
         digest.hash_md5(req.http.X-Development-UserId)
       , 0, 8),
    16)
  );

Esto comienza por hackear el usuario id a una cadena MD5. Luego los primeros 8 chars. se utilizan en el std.strtol funciona lo que lo convierte en un valor entero. Ese valor se utiliza entonces como semilla randomint_seeded función.

Estamos luchando haciendo las mismas funciones que std.strtol y randomint_seeded en cualquier otro idioma (que busca PHP o javascript). Necesitamos tener el mismo resultado en diferentes idiomas.

¿Alguna sugerencia sobre esto?

Pregunta hecha hace 3 años, 5 meses, 2 días - Por codecrafty


2 Respuestas:

  • Para replicar la funcionalidad de las funciones std.strtol y randomint_seeded en PHP o JavaScript, puedes seguir estos pasos:

    Emular std.strtol en PHP:

    En PHP, puedes usar la función hexdec para convertir una cadena hexadecimal a un número entero. Aquí tienes un ejemplo de cómo podrías emular la funcionalidad de std.strtol en PHP:

    php
    $user_id = '12345678';  // Aquí debes colocar el substring de los primeros 8 caracteres del hash MD5
    $seed = hexdec($user_id);
    

    Emular randomint_seeded en PHP:

    Para emular la funcionalidad de la función randomint_seeded en PHP, puedes utilizar la función mt_rand con mt_srand para establecer una semilla. Aquí tienes un ejemplo de cómo podrías hacerlo:

    php
    mt_srand($seed);
    $random_number = mt_rand(1, 4);
    

    Emular std.strtol en JavaScript:

    En JavaScript, puedes usar la función parseInt para convertir una cadena hexadecimal a un número entero. Aquí tienes un ejemplo de cómo podrías emular la funcionalidad de std.strtol en JavaScript:

    javascript
    const user_id = '12345678'; // Aquí debes colocar el substring de los primeros 8 caracteres del hash MD5
    const seed = parseInt(user_id, 16);
    

    Emular randomint_seeded en JavaScript:

    Para emular la funcionalidad de la función randomint_seeded en JavaScript, puedes utilizar el método Math.random() para generar un número aleatorio y luego ajustarlo al rango deseado. Aquí tienes un ejemplo de cómo podrías hacerlo:

    javascript
    Math.seedrandom(seed);
    const random_number = Math.floor(Math.random() * 4) + 1;
    

    Espero que esta información te sea útil para replicar la funcionalidad de las funciones en VCL en PHP o JavaScript. ¡Déjame saber si necesitas más ayuda con esto!

    Respondida el Dec 19, 2020 a las 16:12 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • PHP

    std.strtol

    php
    function std_strtol($string, $base = 10)
    {
        return base_convert($string, $base, 10);
    }
    

    randomint_seeded

    php
    function randomint_seeded($min, $max, $seed)
    {
        srand($seed);
        return rand($min, $max);
    }
    

    Uso:

    php
    $userId = 'my-user-id';
    $hash = md5($userId);
    $seed = std_strtol(substr($hash, 0, 8), 16);
    $randomValue = randomint_seeded(1, 4, $seed);
    

    JavaScript

    std.strtol

    javascript
    function std_strtol(string, base) {
      return parseInt(string, base);
    }
    

    randomint_seeded

    javascript
    function randomint_seeded(min, max, seed) {
      Math.seedrandom(seed);
      return Math.floor(Math.random()  (max - min + 1)) + min;
    }
    

    Uso:*

    javascript
    const userId = 'my-user-id';
    const hash = md5(userId);
    const seed = std_strtol(hash.substr(0, 8), 16);
    const randomValue = randomint_seeded(1, 4, seed);
    

    Nota: Asegúrate de incluir la biblioteca md5.js para usar la función md5 en JavaScript.

    Respondida el Dec 19, 2020 a las 16:16 - por Gemini

    Votos positivos: 0 | Votos negativos: 0