php的crc32函数使用时需要注意的问题(不然就是坑)

前几天写了一个分表程序,用的hash算法是crc32.分表的函数如下:

代码如下:

function _getHash($username)
    {
        $hash = crc32($username) % 512;
        return $hash;
    }

function _getTable($username)
    {
        $hash = self::_getHash($username);
        return 'user_' . $hash;
    }

首先在本地32位window机上生成好数据并插入对应的表中。但是再把程序和数据传到服务器上(64为linux),发现查不到数据。经过排查后发现,原来服务器上crc32的结果和本地不同。再查php手册才知,crc32的接口原来和机器有关。
php手册的描述:

代码如下:

Because PHP's integer type is signed many crc32 checksums will result in negative integers on 32bit platforms. On 64bit installations all crc32() results will be positive integers though.

crc32返回的结果在32位机上会产生溢出,所以结果可能为负数。而在64位机上不会溢出,所以总是正值。

CRC算法是按字长位数bit进行计算的。

crc32函数会按照php中的两个常量参考计算 PHP_INT_SIZE,PHP_INT_MAX
这两个常量的定义:
整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。PHP 不支持无符号整数。Integer值的字长可以用常量PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量PHP_INT_MAX来表示。
输出下32位中PHP_INT_SIZE:4,PHP_INT_MAX:2147483647
输出下64位中PHP_INT_SIZE:8,PHP_INT_MAX:9223372036854775807

(0)

相关推荐

  • php的crc32函数使用时需要注意的问题(不然就是坑)

    前几天写了一个分表程序,用的hash算法是crc32.分表的函数如下: 复制代码 代码如下: function _getHash($username)     {         $hash = crc32($username) % 512;         return $hash;     } function _getTable($username)     {         $hash = self::_getHash($username);         return 'user_

  • MySQL中DATE_FORMATE函数使用时的注意点

    今天帮同事处理一个SQL(简化过后的)执行报错: mysql> select date_format('2013-11-19','Y-m-d') > timediff('2013-11-19', '2013-11-20'); ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC) for operation '>' 乍一看挺莫名其妙的

  • JS封装的三级联动菜单(使用时只需要一行js代码)

    前言 在实际的项目开发中,我们经常需要三级联动,比如省市区的选择,商品的三级分类的选择等等. 而网上却找不到一个代码完整.功能强大.使用简单的三级联动菜单,大都只是简单的讲了一下实现思路. 下面就给大家分享我在工作中封装并在项目中使用的三级级联操作代码,如有错误或者不当的地方欢迎大家指正. 使用简单(只需要一行代码) 可以根据需要设置是否显示"请选择"项 支持回调(在三级分类加载完成后触发回调事件) 支持一个页面多个级联菜单 演示效果预览: 三级联动封装 原理:将selec标签以及相关

  • pyqt5中QThread在使用时出现重复emit的实例

    在PyQt5中使用QThread的时候,要注意把所有QThread的对象在主类中的init(或者放在所有类函数的外面)中进行实例化,不然可能在多个QThread互相调用的时候,emit重复的信号.一般比较正确的写法如下所示,基本照着这种框架搭建都是没问题的. # -*- coding: utf-8 -*- import sys import time from PyQt5.QtWidgets import * from PyQt5.QtCore import * class MainUi(QWi

  • Spring中异步注解@Async的使用、原理及使用时可能导致的问题及解决方法

    前言 其实最近都在研究事务相关的内容,之所以写这么一篇文章是因为前面写了一篇关于循环依赖的文章: <Spring循环依赖的解决办法,你真的懂了吗> 然后,很多同学碰到了下面这个问题,添加了Spring提供的一个异步注解@Async循环依赖无法被解决了,下面是一些读者的留言跟群里同学碰到的问题: 本着讲一个知识点就要讲明白.讲透彻的原则,我决定单独写一篇这样的文章对@Async这个注解做一下详细的介绍,这个注解带来的问题远远不止循环依赖这么简单,如果对它不够熟悉的话建议慎用. 文章要点 @Asy

  • Go语言WaitGroup使用时需要注意的坑

    前言 WaitGroup在go语言中,用于线程同步,单从字面意思理解,wait等待的意思,group组.团队的意思,WaitGroup就是指等待一组,等待一个系列执行完成后才会继续向下执行.Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题. 直到最近的一天同事扔过来一段奇怪的代码: 第一个坑 复制代码 代码如下: package main   import (     "log"       "sync&qu

  • JavaScript实现的CRC32函数示例

    本文实例讲述了JavaScript实现的CRC32函数.分享给大家供大家参考,具体如下: 简介: CRC的全称是循环冗余校验.可用于验证数据的完整性. javascript实现代码如下: (function() { var table = "00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B

  • Git初次使用时的安装配置图文教程

    1.本地电脑没有关联过Git,打开git bush输入$ ssh-keygen -t rsa -C "724277441@qq.com(自己GitHub的邮箱)",创建SSH Key. 2.在我的电脑C盘里面找到.ssh文件夹.打开公钥id_rsa.pub文件,复制里面的内容. 3.进入GItHub - setting - SSH 4.关联仓库 git remote add origin (仓库地址) 5.按照正常步骤 由于远程库是空的,我们第一次推送master分支时,加上了 -u

  • PHP crc32()函数讲解

    PHP crc32() 函数 实例 输出 crc32() 的结果: <?php $str = crc32("Hello World!"); printf("%un",$str); ?> 定义和用法 crc32()函数计算一个字符串的 32 位 CRC(循环冗余校验). 该函数可用于验证数据的完整性. 提示: 为确保您能从 crc32() 函数中取得正确的字符串表示,您必须使用 printf() 或 sprintf() 函数的 %u 格式符.如果未使用 %

  • 解决Tensorflow 使用时cpu编译不支持警告的问题

    使用TensorFlow模块时,弹出错误Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2 原因是下载TensorFlow的版本不支持cpu的AVX2编译. 可能是因为安装时使用的pip install tensorflow ,这样默认会下载X86_64的SIMD版本. 有两种解决办法: 1.忽略这个警告,不看它! import os os.environ["TF

随机推荐