文档库 最新最全的文档下载
当前位置:文档库 › 哈 希 常 见 算 法 及 原 理

哈 希 常 见 算 法 及 原 理

哈 希 常 见 算 法 及 原 理
哈 希 常 见 算 法 及 原 理

java hash算法实现原理

分布式Hash应用

图片缓存到三台服务器上,Hash决定分到哪台服务器

一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

根据同一散列函数计算出的散列值如果不同,那么输入值肯定也不同。但是,根据同一散列函数计算出的散列值如果相同,输入值不一定相同。

两个不同的输入值,根据同一散列函数计算出的散列值相同的现象叫做碰撞。

常见的Hash函数有以下几个:

直接定址法:直接以关键字k或者k加上某个常数(k+c)作为哈希地址。

数字分析法:提取关键字中取值比较均匀的数字作为哈希地址。

除留余数法:用关键字k除以某个不大于哈希表长度m的数p,将所得余数作为哈希表地址。

分段叠加法:按照哈希表地址位数将关键字分成位数相等的几部分,其中最后一部分可以比较短。然后将这几部分相加,舍弃最高进位后的结

果就是该关键字的哈希地址。

平方取中法:如果关键字各个部分分布都不均匀的话,可以先求出它的平方值,然后按照需求取中间的几位作为哈希地址。

伪随机数法:采用一个伪随机数当作哈希函数。

上面介绍过碰撞。衡量一个哈希函数的好坏的重要指标就是发生碰撞的概率以及发生碰撞的解决方案。任何哈希函数基本都无法彻底避免碰撞,常见的解决碰撞的方法有以下几种:

开放定址法

开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。

链地址法

将哈希表的每个单元作为链表的头结点,所有哈希地址为i的元素构成一个同义词链表。即发生冲突时就把该关键字链在以该单元为头结点的链表的尾部。

再哈希法

当哈希地址发生冲突用其他的函数计算另一个哈希函数地址,直到冲突不再产生为止。

建立公共溢出区

将哈希表分为基本表和溢出表两部分,发生冲突的元素都放入溢出表中。

HashMap 的数据结构

在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组

的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。上面我们提到过,常用的哈希函数的冲突解决办法中有一种方法叫做链地址法,其实就是将数组和链表组合在一起,发挥了两者的优势,我们可以将其理解为链表的数组。

hash方法

我们拿JDK 1.7的HashMap为例,其中定义了一个final int hash(Object k) 方法,其主要被以下方法引用。

上面的方法主要都是增加和删除方法,这不难理解,当我们要对一个链表数组中的某个元素进行增删的时候,首先要知道他应该保存在这个链表数组中的哪个位置,即他在这个数组中的下标。而hash()方法的功能就是根据Key来定位其在HashMap中的位置。HashTable、ConcurrentHashMap 同理。

源码解析

首先,在同一个版本的Jdk中,HashMap、HashTable以及ConcurrentHashMap里面的hash方法的实现是不同的。再不同的版本的JDK中(Java7 和 Java8)中也是有区别的。我会尽量全部介绍到。相信,看文这篇文章,你会彻底理解hash方法。

在上代码之前,我们先来做个简单分析。我们知道,hash方法的功能是根据Key来定位这个K-V在链表数组中的位置的。也就是hash方法的输入应该是个Object类型的Key,输出应该是个int类型的数组下标。如果让你设计这个方法,你会怎么做?

其实简单,我们只要调用Object对象的hashCode()方法,该方法会返

回一个整数,然后用这个数对HashMap或者HashTable的容量进行取模就行了。没错,其实基本原理就是这个,只不过,在具体实现上,由两个方法int hash(Object k)和 int indexFor(int h, int length)来实现。但是考虑到效率等问题,HashMap的实现会稍微复杂一点。

hash :该方法主要是将Object转换成一个整型。

indexFor :该方法主要是将hash生成的整型转换成链表数组中的下标。

HashMap In Java 7

final int hash(Object k) {

int h = hashSeed;

if (0 != h k instanceof String) {

return sun.misc.Hashing.stringHash32((String) k);

h ^= k.hashCode();

h ^= (h 20) ^ (h 12);

return h ^ (h 7) ^ (h 4);}

static int indexFor(int h, int length) {

return h (length-1);

前面我说过,indexFor方法其实主要是将hash生成的整型转换成链表数组中的下标。那么 return h (length-1);是什么意思呢?其实,他就是取模。Java之所有使用位运算()来代替取模运算(%),最主要的考虑就是效率。

位运算()效率要比代替取模运算(%)高很多,主要原因是位运算直接对

内存数据进行操作,不需要转成十进制,因此处理速度非常快。

那么,为什么可以使用位运算()来实现取模运算(%)呢?这实现的原理如下:

X % 2^n = X (2^n - 1)

2n表示2的n次方,也就是说,一个数对2n取模 == 一个数和(2^n - 1)做按位与运算。

假设n为3,则2^3 = 8,表示成2进制就是1000。2^3 -1 = 7 ,即0111。

此时X (2^3 - 1) 就相当于取X的2进制的最后三位数。

从2进制角度来看,X - 8相当于 X 3,即把X右移3位,此时得到了X - 8的商,而被移掉的部分(后三位),则是X % 8,也就是余数。

上面的解释不知道你有没有看懂,没看懂的话其实也没关系,你只需要记住这个技巧就可以了。或者你可以找几个例子试一下。

6 % 8 = 6 ,6

7 = 6

10 % 8 = 2 ,10 7 = 2

所以,return h (length-1);只要保证length的长度是 2^n的话,就可以实现取模运算了。而HashMap中的length也确实是2的倍数,初始值是16,之后每次扩充为原来的2倍。

分析完indexFor方法后,我们接下来准备分析 hash方法的具体原理和实现。在深入分析之前,至此,先做个总结。

HashMap的数据是存储在链表数组里面的。在对HashMap进行插入-删除等操作时,都需要根据K-V对的键值定位到他应该保存在数组的哪个下

标中。而这个通过键值求取下标的操作就叫做哈希。

HashMap的数组是有长度的,Java中规定这个长度只能是2的倍数,初始值为16。

求哈希简单的做法是先求取出键值的hashcode,然后在将hashcode 得到的int值对数组长度进行取模。为了考虑性能,Java总采用按位与操作实现取模操作。

以上,就是目前能够得到的结论,但是,由于HashMap使用位运算代替了取模运算,这就带来了另外一个问题,那就是有可能发生冲突。比如:CA11 1000和 0001 1000在对0000 1111进行按位与运算后的值是相等的。

两个不同的键值,在对数组长度进行按位与运算后得到的结果相同,这不就发生了冲突吗。那么如何解决这种冲突呢,来看下Java是如何做的。

其中的主要代码部分如下:

h ^= k.hashCode();

h ^= (h 20) ^ (h 12);

return h ^ (h 7) ^ (h 4);

这段代码是为了对key的hashCode进行扰动计算,防止不同hashCode 的高位不同但低位相同导致的hash冲突。简单点说,就是为了把高位的特征和低位的特征组合起来,降低哈希冲突的概率,也就是说,尽量做到任何一位的变化都能对最终得到的结果产生影响。

举个例子来说,我们现在想向一个HashMap中put一个K-V对,Key 的值为“hollischuang”,经过简单的获取hashcode后,得到的值为

“1011000110101110011111010011011”,如果当前HashTable的大小为16,即在不进行扰动计算的情况下,他最终得到的index结果值为11。由于16的二进制扩展到32位为“00000000000000000000000000001111”,所以,一个数字在和他进行按位与操作的时候,前28位无论是什么,计算结果都一样(因为0和任何数做与,结果都为0)。如下图所示。

可以看到,后面的两个hashcode经过位运算之后得到的值也是11 ,虽然我们不知道哪个key的hashcode是上面例子中的那两个,但是肯定存在这样的key,这就产生了冲突。

那么,接下来,我看看一下经过扰动的算法最终的计算结果会如何。

从上面图中可以看到,之前会产生冲突的两个hashcode,经过扰动计算之后,最终得到的index的值不一样了,这就很好的避免了冲突。

其实,使用位运算代替取模运算,除了性能之外,还有一个好处就是可以很好的解决负数的问题。因为我们知道,hashcode的结果是int类型,而int的取值范围是-2^31 ~ 2^31 - 1,即[ -2147483648, 2147483647];这里面是包含负数的,我们知道,对于一个负数取模还是有些麻烦的。如果使用二进制的位运算的话就可以很好的避免这个问题。首先,不管hashcode的值是正数还是负数。 length-1这个值一定是个正数。那么,他的二进制的第一位一定是0(有符号数用最高位作为符号位,“0”代表“+”,“1”代表“-”),这样里两个数做按位与运算之后,第一位一定是个0,也就是,得到的结果一定是个正数。

HashTable In Java 7

final int hash(Object k) {

int h = hashSeed;

if (0 != h k instanceof String) {

return sun.misc.Hashing.stringHash32((String) k); }

h ^= k.hashCode();

h ^= (h 20) ^ (h 12);

return h ^ (h 7) ^ (h 4);}

static int indexFor(int h, int length) {

return h (length-1);}

上面是Java 7中HashMap的hash方法以及 indexOf方法的实现,那么接下来我们要看下,线程安全的HashTable是如何实现的,和HashMap 有何不同,并试着分析下不同的原因。以下是Java 7中HashTable的hash 方法的实现。

private int hash(Object k) {

-- hashSeed will be zero if alternative hashing is disabled.

return hashSeed ^ k.hashCode();}

我们可以发现,很简单,相当于只是对k做了个简单的hash,取了一下其hashCode。而HashTable中也没有indexOf方法,取而代之的是这段代码:

int index = (hash 0x7FFFFFFF) % tab.length;

也就是说,HashMap和HashTable对于计算数组下标这件事,采用了两种方

HashMap采用的是位运算,而HashTable采用的是直接取模。

为啥要把hash值和0x7FFFFFFF做一次按位与操作呢,主要是为了保证得到的index的的二进制的第一位为0(一个32位的有符号数和0x7FFFFFFF做按位与操作,其实就是在取绝对值。),也就是为了得到一个正数。因为有符号数第一位0代表正数,1代表负数。

我们前面说过,HashMap之所以不用取模的原因是为了提高效率。有人认为,因为HashTable是个线程安全的类,本来就慢,所以Java并没有考虑效率问题,就直接使用取模算法了呢?但是其实并不完全是,Java这样设计还是有一定的考虑在的,虽然这样效率确实是会比HashMap慢一些。

其实,HashMap采用简单的取模是有一定的考虑在的。这就要涉及到HashTable的构造函数和扩容函数了。由于篇幅有限,这里就不贴代码了,直接给出结论:

HashTable默认的初始大小为11,之后每次扩充为原来的2n+1。

也就是说,HashTable的链表数组的默认大小是一个素数、奇数。之后的每次扩充结果也都是奇数。

至此,我们看完了Java 7中HashMap和HashTable中对于hash的实现,我们来做个简单的总结。

HashMap默认的初始化大小为16,之后每次扩充为原来的2倍。

HashTable默认的初始大小为11,之后每次扩充为原来的2n+1。

当哈希表的大小为素数时,简单的取模哈希的结果会更加均匀,所以单从这一点上看,HashTable的哈希表大小选择,似乎更高明些。因为hash 结果越分散效果越好。

在取模计算时,如果模数是2的幂,那么我们可以直接使用位运算来

得到结果,效率要大大高于做除法。所以从hash计算的效率上,又是HashMap更胜一筹。

但是,HashMap为了提高效率使用位运算代替哈希,这又引入了哈希分布不均匀的问题,所以HashMap为解决这问题,又对hash算法做了一些改进,进行了扰动计算。

ConcurrentHashMap In Java 7

private int hash(Object k) {

int h = hashSeed;

if ((0 != h) (k instanceof String)) {

return sun.misc.Hashing.stringHash32((String) k);

h ^= k.hashCode();

-- Spread bits to regularize both segment and index locations, -- using variant of single-word Wang-Jenkins hash.

h += (h 15) ^ 0xffffcd7d;

h ^= (h 10);

h += (h 3);

h ^= (h 6);

h += (h 2) + (h 14);

return h ^ (h 16);}

int j = (hash segmentShift) segmentMask;

上面这段关于ConcurrentHashMap的hash实现其实和HashMap如出一辙。都是通过位运算代替取模,然后再对hashcode进行扰动。区别在于,

ConcurrentHashMap 使用了一种变种的Wang-Jenkins 哈希算法,其主要目的也是为了把高位和低位组合在一起,避免发生冲突。至于为啥不和HashMap采用同样的算法进行扰动,我猜这只是程序员自由意志的选择吧。至少我目前没有办法证明哪个更优。

HashMap In Java 8

在Java 8 之前,HashMap和其他基于map的类都是通过链地址法解决冲突,它们使用单向链表来存储相同索引值的元素。在最坏的情况下,这种方式会将HashMap的get方法的性能从O(1)降低到 O(n)。

为了解决在频繁冲突时hashmap性能降低的问题,Java 8中使用平衡树来替代链表存储冲突的元素。这意味着我们可以将最坏情况下的性能从O(n)提高到 O(logn)。关于HashMap在Java 8中的优化,我后面会有文章继续深入介绍。

如果恶意程序知道我们用的是Hash算法,则在纯链表情况下,它能够发送大量请求导致哈希碰撞,然后不停访问这些key导致HashMap忙于进行线性查找,最终陷入瘫痪,即形成了拒绝服务攻击(DoS)。

关于Java 8中的hash函数,原理和Java 7中基本类似。Java 8中这一步做了优化,只做一次16位右位移异或混合,而不是四次,但原理是不变的。

static final int hash(Object key) {

return (key == null) ? 0 : (h = key.hashCode()) ^ (h 16);} 在JDK1.8的实现中,优化了高位运算的算法,通过hashCode()的高16位异或低16位实现的:(h = k.hashCode()) ^ (h 16),主要是从速度、

功效、质量来考虑的。以上方法得到的int的hash值,然后再通过h (table.length -1)来得到该对象在数据中保存的位置。

HashTable In Java 8

在Java 8的HashTable中,已经不在有hash方法了。但是哈希的操作还是在的,比如在put方法中就有如下实现:

int hash = key.hashCode();

int index = (hash 0x7FFFFFFF) % tab.length;

这其实和Java 7中的实现几乎无差别,就不做过多的介绍

HashTable In Java 8

在Java 8的HashTable中,已经不在有hash方法了。但是哈希的操作还是在的,比如在put方法中就有如下实现:

int hash = key.hashCode();

int index = (hash 0x7FFFFFFF) % tab.length;

这其实和Java 7中的实现几乎无差别,就不做过多的介绍了。

ConcurrentHashMap In Java 8

Java 8 里面的求hash的方法从hash改为了spread。实现方式如下:static final int spread(int h) {

return (h ^ (h 16)) HASH_BITS;}

Java 8的ConcurrentHashMap同样是通过Key的哈希值与数组长度取模确定该Key在数组中的索引。

至此,我们已经分析完了HashMap、HashTable以及ConcurrentHashMap 分别在Jdk 1.7 和 Jdk 1.8中的实现。我们可以发现,为了保证哈希的

结果可以分散、为了提高哈希的效率,JDK在一个小小的hash方法上就有很多考虑,做了很多事情。当然,我希望我们不仅可以深入了解背后的原理,还要学会这种对代码精益求精的态度。

Jdk的源代码,每一行都很有意思,都值得花时间去钻研、推敲

一次性Hash算法

Hash的缺陷

增加一台服务器,余数改变

=========================

一致性Hash算法

服务器分部

服务器编号

根据编号计算分布在2^32圆环上

数据存放

顺时针旋转第一个为要存放的服务器

服务器分部不均匀

解决方案--虚拟服务器

对于A服务器,映射出A1,A2,A3

ListString res=new ArrayListString();

uint32_t?time33(char?const?*str,?int?len)?

散列冲突的概率要小,对于不同的原始数据,哈希值相同的概率非常小

mergeSortRecur(arr, left, mid);

·SHA3。看名称就知道,这是SHA算法家族的第三代,之前名为Keccak 算法,SHA3并不是要取代SHA2,因为目前SHA2并没有出现明显的弱点。

if nums[i] == newnumber[left]:

(3)负载因子的大小。太大不一定就好,而且浪费空间严重,负载因子和散列函数是联动的。

3、a负载因子太小(关键码-哈希表长度)a越大,则哈希表的剩余空间越小,

jdk5.0里面的String类的hashCode()方法也使用乘法Hash。不过,它使用的乘数是31。推荐的乘数还有:131, 1313, 13131, 131313等等。

负载均衡算法有很多,比如轮询、随机、加权轮询等。那如何才能实现一个会话粘滞(session sticky)的负载均衡算法呢?也就是说,我们需要在同一个客户端上,在一次会话中的所有请求都路由到同一个服务器上。

理论力学复习题及答案(哈工大版)汇总

一、是非题 1、力有两种作用效果,即力可以使物体的运动状态发生变化,也可以使物体发生变形。 (√) 2、在理论力学中只研究力的外效应。(√) 3、两端用光滑铰链连接的构件是二力构件。(×) 4、作用在一个刚体上的任意两个力成平衡的必要与充分条件是:两个力的作用线相同, 大小相等,方向相反。(√) 5、作用于刚体的力可沿其作用线移动而不改变其对刚体的运动效应。(×) 6、三力平衡定理指出:三力汇交于一点,则这三个力必然互相平衡。(×) 7、平面汇交力系平衡时,力多边形各力应首尾相接,但在作图时力的顺序可以不同。 (√) 8、约束力的方向总是与约束所能阻止的被约束物体的运动方向一致的。(×) 9、在有摩擦的情况下,全约束力与法向约束力之间的(应是最大)夹角称为摩擦角。(×) 10、用解析法求平面汇交力系的平衡问题时,所建立的坐标系x,y轴一定要相互垂直。 (×) 11、一空间任意力系,若各力的作用线均平行于某一固定平面,则其独立的平衡方程最多只有3个。 (×) 12、静摩擦因数等于摩擦角的正切值。(√) 13、一个质点只要运动,就一定受有力的作用,而且运动的方向就是它受力方向。(×) 14、已知质点的质量和作用于质点的力,质点的运动规律就完全确定。(×) 15、质点系中各质点都处于静止时,质点系的动量为零。于是可知如果质点 系的动量为零,则质点系中各质点必都静止。(×) 16、作用在一个物体上有三个力,当这三个力的作用线汇交于一点时,则此力系必然平衡。 (×) 17、力对于一点的矩不因力沿其作用线移动而改变。(√) 18、在自然坐标系中,如果速度υ= 常数,则加速度α= 0应是切线方向加速度为零。(×) 19、设一质点的质量为m,其速度 与x轴的夹角为α,则其动量在x轴上的投影为mvx =mvcos a。(√) 20、用力的平行四边形法则,将一已知力分解为F1和F2两个分力,要得到唯一解答,必须具备:已知 F1和F2两力的大小;或已知F1和F2两力的方向;或已知F1或F2中任一个力的大小和方向。 ( √) 21、某力在一轴上的投影与该力沿该坐标轴的分力其大小相等,故投影就是分力。 ( ×) 22、图示结构在计算过程中,根据力线可传性原理,将力P由A点传至B点,其作用效果不变。 (×)

哈工大理论力学期末考试及答案

三、计算题(本题10分) 图示平面结构,自重不计,B 处为铰链联接。已知:P = 100 kN ,M = 200 kN ·m ,L 1 = 2m ,L 2 = 3m 。试求支座A 的约束力。 四、计算题(本题10分) 在图示振系中,已知:物重Q ,两并联弹簧的刚性系数为k 1与k 2。如果重物悬挂的位置使两弹簧的伸长相等,试求:(1)重物振动的周期;(2)此并联弹簧的刚性系数。 五、计算题(本题15分) 半径R =0.4m 的轮1沿水平轨道作纯滚动,轮缘上A 点铰接套筒3,带动直角杆2作上下运动。已知:在图示位置时,轮心速度C v =0.8m/s ,加速度为零,L =0.6m 。试求该瞬时:(1)杆2的速度2v 和加速度2a ;(2)铰接点A 相对于杆2的速度r v 和加速度r a 。 六、计算题(本题15分) 在图示系统中,已知:匀质圆盘A 和B 的半径各为R 和r ,质量各为M 和m 。试求:以φ和θ为广义坐标,用拉氏方程建立系统的运动微分方程。

七、计算题(本题20分) 在图示机构中,已知:纯滚动的匀质轮与物A 的质量均为m ,轮半径为r ,斜面倾角为β,物A 与斜面的动摩擦因数为'f ,不计杆OA 的质量。试求:(1)O 点的加速度;(2)杆OA 的内力。 答案 三、解,以整体为研究对象,受力如图所示。 由()0C M F =∑ 11222(2)20A x A y P L F L L F L M ?-?--?-= ……(1) 再以EADB 为研究对象受力如图所示, 由12()0 0B Ax Ay M F F L F L M =?-?-=∑ (2)

哈工大版理论力学复习

第一章静力学的基本概念与公理 一、重点及难点 1.力的概念 力是物体间的相互机械作用,其作用效果可使物体的运动状态发生改变和使物体产生变形。前者称为力的运动效应或外效应,后者称为力的变形效应或内效应。力对物体的作用效果,取决于三个要素:①力的大小:②力的方向;⑧力的作用点。力是定位矢量。 2.刚体的概念 所谓刚体,是指在力的作用下形状和大小都始终保持不变的物体;或者说,刚体内任意两点间的距离保持不变。刚体是实际物体抽象化的一种力学模型。 3.平衡的概念 在静力学中,平衡是指物体相对惯性坐标系(地球)处于静止或作匀速直线运动的状态。它是机械运动的特殊情况。 4.静力学公理 静力学公理概括了力的基本性质,是静力学的理论基础。 公理一(二力平衡原理):作用在刚体上的两个力,使刚体处于平衡的必要和充分条件是:这两个力的大小相等。方向相反,作用在同一直线上。 公理二(加减平衡力系原理):可以在作用于刚体的任何一个力系上加上或去掉几个互成平衡的力,而不改变原力系对刚体的作用效果。推论(力在刚体广的可传性):作用在刚体上的力可沿其作用线在刚体内移动,而不改变它对该刚体的作用效果。 公理三(力的平行四边形法则):作用于物体上任一点的两个力可合成为作用于同一点的一个力,即合力。合力的矢由原两力的矢为邻边而作出的力平行四边形的对角矢来表示。即合力为原两力的矢量和。推论(三力平衡汇交定理):作用于刚体上3个相互平衡的力,若其中两个力的作用线汇交于—点,则此3个力必在同一平面内,且第3个力的作用线通过汇交点。 公理四(作用和反作用定律)任何两个物体相互作用的力,总是大小相等,方向相反,沿同一直线,并分别作用在这两个物体上。 公理五(刚化原理):变形体在某一力系作用下处于平衡时,如将此变形体刚化为刚体,则平衡状态保持不变。 应当注意这些公理中有些是对刚体,而有些是对物体而言。5.约束与约束反力 限制物体运动的条件称为约束。构成约束的物体称为约束体,也称为约束。约束反力是约束作用在被约束物体上的力,其方向与约束

理论力学哈工大第八版答案

哈尔滨工业大学理论力学教研室理论力学(I)第8版习题答案《理论力学(1 第8版)/“十二五”普通高等教育本科国家级规划教材》第1版至第7版受到广大教师和学生的欢迎。第8版仍保持前7版理论严谨、逻辑清晰、由浅入深、宜于教学的风格体系,对部分内容进行了修改和修正,适当增加了综合性例题,并增删了一定数量的习题。本书内容包括静力学(含静力学公理和物体的受力分析、平面力系、空间力系、摩擦),运动学(含点的运动学、刚体的简单运动、点的合成运动、刚体的平面运动),动力学(含质点动力学的基本方程、动量定理、动量矩定理、动能定理、达朗贝尔原理、虚位移原理)。本书可作为高等学校工科机械、土建、水利、航空、航天等专业理论力学课程的教材,也可作为高职高理论力学(I)第8版哈尔滨工业大学理论力学教研室习题答案专、成人高校相应专业的自学和函授教材,亦可供有关工程技术人员参考。本书配套的有《理论力学学习辅导》、《理论力学(I)第8版哈尔滨工业大学理论力学教研室习题答案理论力学思考题集》、《理论力学解题指导及习题集》(第3版)、《理论力学电子教案》、《理论力学网络课程》、《理论力学习题解答》、《理论力学网上作业与查询系统》等。 理论力学(I)第8版哈尔滨工业大学理论力学教研室课后答案前辅文 静力学

关注网页底部或者侧栏二维码回复 理论力学(I)第8版答案免费获取答案 引言 第一章静力学公理哈尔滨工业大学理论力学教研室理论力学(I)第8版课后答案理论力学思考题集》、《理论力学解题指导及习题集》(第3版)、《理论力学电子教案》、《理论力学网络课程》、《理论力学习题解答》、《理论力学网上作业与查询系统》等。 理论力学(I)第8版哈尔滨工业大学理论力学教研室课后答案前辅文 静力学 引言 第一章静力学公理和物体的受力分析

哈工大第七版 理论力学 课后有题答案 10章

10-3 如图所示水平面上放1 均质三棱柱A,在其斜面上又放 1 均质三棱柱B。两三棱柱的横截面均为直角三角形。三棱柱A的质量为mA三棱柱 B 质量mB的 3 倍,其尺寸如图所示。设各处摩擦不计,初始时系统静止。求当三棱柱 B 沿三棱柱A滑下接触到水平面时,三棱柱A移动的距离。 11-4 解取A、B 两三棱柱组成 1 质点系为研究对象,把坐标轴Ox 固连于水平面上,O 在 棱柱A左下角的初始位置。由于在水平方向无外力作用,且开始时系统处于静止,故系统 质心位置在水平方向守恒。设A、B 两棱柱质心初始位置(如图b 所示)在x 方向坐标 分别为 当棱柱 B 接触水平面时,如图c所示。两棱柱质心坐标分别为 系统初始时质心坐标 棱柱 B 接触水平面时系统质心坐标 因并注意到得 10-4 如图所示,均质杆AB,长l,直立在光滑的水平面上。求它从 铅直位无 初速地倒下时,端点A相对图b所示坐标系的轨迹。 解取均质杆AB 为研究对象,建立图11-6b 所示坐标系Oxy,原点O 与杆AB 运动初始时的点 B 重合,因为杆只受铅垂方向的重力W 和地 面约束反力N F 作用,且系统开始时静止,所以杆AB 的质心沿轴x 坐 标恒为零,即

设任意时刻杆AB 与水平x 轴夹角为θ,则点A坐标 从点A坐标中消去角度θ,得点A轨迹方程 10-5 质量为m1 的平台AB,放于水平面上,平台与水平面间的动滑动摩擦因数为f。 质量为m2 的小车D,由绞车拖动,相对于平台的运动规律为,其中b 为已知常数。不计绞车的质量,求平台的加速度。 解受力和运动分析如图b 所示 式(1)、(4)代入式(3),得 10-6 如图所示,质量为m的滑块A,可以在水平光滑槽中运动,具有刚性系 数为k 的弹簧 1 端与滑块相连接,另 1 端固定。杆AB 长度为l,质量忽略不计,A端与滑块A铰接,B 端装有质量m1,在铅直平面内可绕点A旋转。设在力偶M 作用下转动角速度ω为常数。求滑块A的运动微分方程。 解取滑块A和小球B组成的系统为研究对象,建立向右坐标x,原点取在 运动开始时滑块A的质心上,则质心之x 坐标为

理论力学期末考试5(含答案)

哈工大2001年秋季学期理论力学试题 一、是非题(每题2分。正确用√,错误用×,填入括号内。) 1、作用在一个物体上有三个力,当这三个力的作用线汇交于一点时,则此力系必然平衡。() 2、力对于一点的矩不因力沿其作用线移动而改变。() 3、在自然坐标系中,如果速度v = 常数,则加速度a = 0。() 4、虚位移是假想的,极微小的位移,它与时间、主动力以及运动的初始条件无关。() 5、设一质点的质量为m,其速度v与x轴的夹角为α,则其动量在x轴上的投影为mv x =mv cosα。() 二、选择题(每题3分。请将答案的序号填入划线内。) 1、正立方体的顶角上作用着六个大小相等的力,此力系向任一点简化的结果是。 ①主矢等于零,主矩不等于零; ②主矢不等于零,主矩也不等于零; ③主矢不等于零,主矩等于零; ④主矢等于零,主矩也等于零。 2、重P的均质圆柱放在V型槽里,考虑摩擦柱上作用一力偶,其矩为M时(如图),圆柱处于极限平衡状态。此时按触点处的法向约束力N A与N B的关系为。 ①N A = N B;②N A > N B;③N A < N B。

3、边长为L 的均质正方形平板,位于铅垂平面内并置于光滑水平面上,如图示,若给平板一微小扰动,使其从图示位置开始倾倒,平板在倾倒过程中,其质心 C 点的运动轨迹是 。 ①半径为L /2的圆弧; ②抛物线; ③椭圆曲线; ④铅垂直线。 4、在图示机构中,杆O 1 A //O 2 B ,杆O 2 C //O 3 D ,且O 1 A = 200mm ,O 2 C = 400mm , CM = MD = 300mm ,若杆AO 1 以角速度 ω= 3 rad / s 匀速转动,则D 点的速度的大小为 cm/s ,M 点的加速度的大小为 cm/s 2。 ① 60; ②120; ③150; ④360。 5、曲柄OA 以匀角速度转动,当系统运动到图示位置(OA //O 1 B ,AB OA )时,有A v B v ,A a B a ,AB ω 0,αAB 0。 ①等于; ②不等于。

哈尔滨工业大学第7版理论力学第4章课后习题答案_图文(精)

图 4-1 图4-2

图4-3 第4章空间力系 4-1 力系中,F 1=100 N ,F 2=300 N ,F 3=200 N ,各力作用线的位置如图4-1所示。试将力系向原点O 简化。 解由题意得 N 3455 2200132300R ?=× ?×?=x F N 25013 3 300R =× =y F N 6.1051200100R =×

?=z F m N 8.513.05 12001.013 3300??=×× ?×× ?=x M m N 6.361.013 220020.0100??=××+×?=y M m N 6.1033.05 22002.013 3300?=×× +××=z M 主矢N 4262R 2R 2R R =++=x y z F F F F ,N 6.10250345(R k j i ++?=F 主矩 m N 12222 2?=++= z y x O M M M M ,m N 1046.368.51(?+??=k j i O M 4-2 1平行力系由5个力组成,力的大小和作用线的位置如图4-2所示。图中小正方格 的边长为10 mm 。求平行力系的合力。 解由题意得合力R F 的大小为

N 20N 15N 10N 20N 10N 1R =??++=Σ=z F F N 20R k F =合力作用线过点(C x ,C y ,0 : mm 601010202030104015(201=×?×+×+×=C x mm 5.3240152010502030101015(20 1 =×?×?×+×+×= C y 4-3 图示力系的3个力分别为N 3501=F ,N 4002=F 和N 6003=F ,其作用线的 位置如图4-3所示。试将此力系向原点O 简化。 解由题意得 N 1442 1 6001001860350'R ?=× ?×=x F N 0101866 .0600707.04001001880350'R =×+×+× =y F N 517707.0400100 1890350'R ?=×??×

相关文档
相关文档 最新文档